2011-11-22 72 views
2

在C#中的for循環中,下列哪些代碼塊是最佳性能明智的?還是沒有區別? 不同之處在於條件是保存在局部變量中還是直接從對象中讀取。從for循環和if語句中讀取本地變量或對象的值?

選項1個

float maxDepth = 0; 
int maxnumber = 0; 

for (int i = 0; i < defects.Total; i++) 
{ 
    if (defects[i].Depth > maxDepth) 
    { 
     maxDepth = defects[i].Depth; 
     maxnumber = i; 
    } 
} 

選項2

​​

我很抱歉,如果這個問題已經被問了很多,但我不能在任何地方找到它。

安德斯

+0

爲什麼不試試它看到了嗎? – asawyer

+0

編譯器會知道在循環過程中Total不會改變,並且會將其替換爲值,因此無論如何您最終都會得到第二個代碼。 – MBen

+0

@MBen:編譯器如何知道這一點? *我們*不知道。我們不知道什麼是「缺陷。總體」。 –

回答

2

對於您可以使用System.Diagnostics.Stopwatch這樣所有問題。

var stopwatch = new Stopwatch(); 
stopwatch.Start(); 

float maxDepth = 0; 
int maxnumber = 0; 
for (int i = 0; i < defects.Total; i++) 
{  
    if (defects[i].Depth > maxDepth)  
    {   
     maxDepth = defects[i].Depth;   
     maxnumber = i;  
    } 
} 

stopwatch.Stop(); 
Debug.WriteLine("Elapesed time for method 1: {0} msec.", stopwatch.ElapsedMilliseconds); 
stopwatch.Reset(); 
stopwatch.Start(); 

maxDepth = 0; 
maxnumber = 0; 
int defectNumber = defects.Total; 
for (int i = 0; i < defectNumber; i++)  
{  
    if (defects[i].Depth > maxDepth)  
    {   
     maxDepth = defects[i].Depth;   
     maxnumber = i;  
    } 
} 
stopwatch.Stop(); 
Debug.WriteLine("Elapesed time for method 2: {0} msec.", stopwatch.ElapsedMilliseconds); 

然後你得到了確切的信息。 (最好的方法是進行幾次運行並使用平均值)

+0

猜猜我會試試這個。只是認爲這是一個共同的答案:) –

+0

@AndersJørgensen:當然有一般的答案。 ;-)但這就是理論,我總是交叉檢查現實並做一些測量。 – Fischermaen

0

您的第一個示例必須繼續解決缺陷。一般來說,這會比在本地int中具有值慢。我不瞭解C#的內部工作原理,所以我不能確定哪個更快或更多,但總體而言,我會說第二種方法更好。

0

選項2將使用更少的內存,但由於少一個解除引用步驟,它會稍微快一點。

這兩種方式不會有太大的區別,除非你計算的數十億次以上的迭代。

0

我不認爲重要很多,當涉及到性能,但是我用的是第二個選項能夠更好的觀察代碼,更容易調試和可讀性象下面這樣:

float maxDepth = 0; 
int maxNumber = 0 

int defectNumber = defects.Total; 
for (int i = 0; i < defectNumber; i++) 
{ 
    float defectsCurrentDepth = defects[i].Depth; 
    if (defectsCurrentDepth > maxDepth) 
    { 
     maxDepth = defectsCurrentDepth; 
     maxNumber = i; 
    } 
}