我前幾天和一位同事討論了這個假設情況。運行編譯代碼時C# - 變量範圍和處理如何影響處理效率?
public void Main()
{
string1 = null;
string2 = null,
MyDto dto = Repository.GetDto();
foreach(var row in dto.Rows)
{
ProcessStrings(row, string1, string2)
}
}
public void ProcessStrings(DataRow row, string string1, string string2)
{
string1 = GetStringFromDataRow(row, 1);
string2 = GetStringFromDataRow(row, 2);
// do something with the strings
}
如何將這些在處理不同:考慮這個僞代碼:
public void Main()
{
MyDto dto = Repository.GetDto();
foreach(var row in dto.Rows)
{
ProcessStrings(row);
}
}
public void ProcessStrings(DataRow row)
{
string string1 = GetStringFromDataRow(row, 1);
string string2 = GetStringFromDataRow(row, 2);
// do something with the strings
}
那麼這個功能相同的選擇嗎?我們是否認爲第二個版本的效率更高一些,因爲字符串變量會佔用較少的內存並且只能被放置一次,而在第一個版本中,它們在循環的每一遍都會被處理掉?
如果第二個版本中的字符串被ref
或out
參數傳遞,會有什麼區別嗎?
他們沒有被處置。他們正在GC'd。 – Karolis
我期望第二個版本稍微慢一點*,因爲你傳遞的是不必要的參數。您正在交易參數的局部變量,但兩者都只是對實際字符串對象的引用。 –
@PieterWitvoet在CPU級這兩個例子可以處理使用CPU寄存器和/或疊層,其可能或可能不實際具有相同的執行配置文件的變量和參數。換句話說,即使C#代碼不同,在最終代碼中可能根本就沒有任何區別。然而,有些代碼很可能會被移動,但是我懷疑這是否會在高度理論層面上起作用。 –