2011-01-20 26 views
7

讓我們比較兩段代碼:使用null初始化局部變量是否會影響性能?

String str = null; 
//Possibly do something... 
str = "Test"; 
Console.WriteLine(str); 

String str; 
//Possibly do something... 
str = "Test"; 
Console.WriteLine(str); 

我總是在想,這些代碼段是相等的。但經過我有構建這些代碼(Release模式與優化檢查)和IL比較方法產生我注意到,有第一個樣品在兩個IL指令:

1示例代碼IL:

.maxstack 1
.locals的init([0]字符串str)
IL_0000:ldnull
IL_0001:stloc.0
IL_0002:ldstr 「測試」
IL_0007:stloc.0
IL_0008:ldloc.0
IL_0009:呼叫空隙[mscorlib程序] System.Console:的WriteLine(字符串)
IL_000e:滯留

第二示例代碼IL:

.maxstack 1
.locals的init([0]字符串str )
IL_0000:ldstr 「測試」
IL_0005:stloc.0
IL_0006:ldloc.0
IL_0007:CALL空隙[mscorlib程序] System.Console:的WriteLine(字符串)
IL_000c:滯留

可能這個代碼是由JIT compiller優化的? 因此,初始化本地方法變量null影響性能(我知道這是非常簡單的操作,但任何情況),我們應該避免它? 預先感謝。

+4

它通常被認爲是不好的形式來初始化一個永遠不會被使用的值,只是因爲它增加了混淆(有一個'null'被賦值,這對邏輯沒有任何意義。)任何關聯的性能命中都可以忽略不計;前一個原因是避免它的一個更有說服力的理由。 – 2011-01-20 19:31:54

回答

6

它慢一點,正如Jon.Stromer.Galley的鏈接指出的那樣。但差異非常小,可能在納秒的數量級上。在那個級別上,使用像C#這樣的高級語言所帶來的開銷會使任何性能上的差異變得越來越小。如果性能是一個很大的問題,那麼你可能會用C或ASM或其他編碼。

在成本與收益方面,編寫清晰的代碼(無論對您而言意味着什麼)的價值遠遠超過0.00001ms的性能提升。這就是爲什麼C#和其他高級語言首先存在的原因。

我知道這可能意味着作爲一個學術問題,我不會打折瞭解CLR內部的價值。但在這種情況下,這似乎是錯誤的重點。