2012-09-19 30 views
0

我想知道這給了我們兩個的方式更好地執行下面給出:什麼讓你有更好的表現? C#:常量與正常領域-in FOR循環領域申報

1路1

for(int i = 0; i < 10; i++) 
{ 
    // do something in loop 
} 

2.方式2

for(int i = Constants.Zero; i < Constants.Ten; i++) 
{ 
    // do something in loop 
} 
private const int Zero = 0; 

private const int Ten = 10; 

基本上我想知道,我們可以提高應用程序的性能,如果我們在for loop variable declaration使用Constants如上所述?

在此先感謝!

+0

我明白這只是示例代碼,但我確實希望在生產代碼中使用更有意義的常量名稱。 :) – Sven

+0

我知道你只是發佈一個例子,但爲什麼你會使用一個常數爲零? – JonH

+1

[如果只有一種方法來測試這個...](http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) –

回答

4

這裏沒有任何的性能優勢,因爲以這種方式聲明的變量最終會變成注入常量,就像在第一種情況下一樣。所以他們變得基本一樣。

//code 1 
for(int i = 0; i < 10; i++) 
{ 
    Console.WriteLine("Hello"); 
} 

//IL 1 

IL_0001: ldc.i4.0  
IL_0002: stloc.0  
IL_0003: br.s  IL_0016 
IL_0005: nop   
IL_0006: ldstr  "Hello" 
IL_000B: call  System.Console.WriteLine 
IL_0010: nop   
IL_0011: nop   
IL_0012: ldloc.0  
IL_0013: ldc.i4.1  
IL_0014: add   
IL_0015: stloc.0  
IL_0016: ldloc.0  
IL_0017: ldc.i4.s 0A 
IL_0019: clt   
IL_001B: stloc.1  
IL_001C: ldloc.1  
IL_001D: brtrue.s IL_0005 

//code 2 
for(int i = Constants.Zero; i < Constants.Ten; i++) 
{ 
    Console.WriteLine("Hello"); 
} 

//IL 2 
IL_0001: ldsfld  UserQuery+Constants.Zero 
IL_0006: stloc.0  
IL_0007: br.s  IL_001A 
IL_0009: nop   
IL_000A: ldstr  "Hello" 
IL_000F: call  System.Console.WriteLine 
IL_0014: nop   
IL_0015: nop   
IL_0016: ldloc.0  
IL_0017: ldc.i4.1  
IL_0018: add   
IL_0019: stloc.0  
IL_001A: ldloc.0  
IL_001B: ldsfld  UserQuery+Constants.Ten 
IL_0020: clt   
IL_0022: stloc.1  
IL_0023: ldloc.1  
IL_0024: brtrue.s IL_0009 

情況下,我使用的static類來創建常量。

+0

你確定你的常量在第二個例子中被實際聲明爲'const'嗎?如果他們是那麼我希望IL *與第一個例子完全相同,並且在那裏沒有那些'ldsfld'指令。 – LukeH

+0

@LukeH:不,自然會導致其靜態類,所以它們被聲明爲*只讀*。 – Tigran

+0

是的..它們被聲明爲一個實際的常量。 (使用const關鍵字) – nunu

3

沒有性能差異。編譯後的for循環在兩種情況下都完全相同。

常量被「燒入」編譯後的代碼中,就像您使用文字值一樣。 (而且我假設這僅僅是一個玩具的例子:否則你爲什麼要替換完全不錯的,普遍認可的符號 - 010等等 - 用你自己的版本並不廣爲人知?)