2013-03-17 66 views
-3

在這個線程中,我們討論了關於for loopforeach的性能分析。 哪一個可以提供更好的性能 - forforeach循環和foreach的性能分析

這裏有兩種簡單的方法:

public static void TestFor() 
{ 

    Stopwatch stopwatch = Stopwatch.StartNew(); 
    int[] myInterger = new int[1]; 
    int total = 0; 
    for (int i = 0; i < myInterger.Length; i++) 
    { 
     total += myInterger[i]; 
    } 
    stopwatch.Stop(); 
    Console.WriteLine("for loop Time Elapsed={0}", stopwatch.Elapsed); 
} 
public static void TestForeach() 
{ 
    Stopwatch stopwatchForeach = Stopwatch.StartNew(); 
    int[] myInterger1 = new int[1]; 
    int totall = 0; 
    foreach (int i in myInterger1) 
    { 
     totall += i; 
    } 

    stopwatchForeach.Stop(); 
    Console.WriteLine("foreach loop Time Elapsed={0}", stopwatchForeach.Elapsed); 
} 

然後我跑的上面的代碼的結果是foreach循環時間已= 00:00:00.0000003, for循環時間已= 00:00:00.0001462。我認爲我們需要高性能的代碼。我們將使用foreach

+0

在for循環中,您應該在'for'語句之外存儲'myInteger.Length'以獲得更好的性能。否則,它將不得不查詢每次迭代的數組長度。 – ryan 2013-03-17 14:58:49

+0

您是否在'TestFor'和'TestForeach'調用之間調用'GC.Collect'?我認爲第一次測試可能會影響第二次垃圾回收的結果。 – user20140268 2013-03-17 15:05:36

+0

任何沒有運行的性能測試都會導致時間測量長達數秒(如果不是幾分鐘),這種迭代計數是可疑的。你太可怕了,可能會增加幾十分之一秒的誤會,相信任何性能測試的整體運行時間不到5秒鐘。 – 2013-03-17 16:09:34

回答

1

我的決定不會基於這樣一個簡單的性能循環。我假設你經常使用循環/大型數據集。直到我們開始談論數十萬次(至少)的迭代時,纔會注意到這種差異。 1)如果您正在編寫具有潛在內存壓力的框架(XBOX,Windows Phone,Silverlight)的應用程序。我會使用for循環,因爲foreach可以留下可以留下來收集的輕量級「垃圾」。幾年前我在做遊戲的XBOX開發時,一個常見的技巧是使用for循環初始化屏幕上顯示的固定數組項目,並將其保存在內存中,然後不必擔心垃圾收集/內存調整/垃圾回收等。如果你有一個這樣的循環叫60+次/秒(即遊戲)

2)如果你有一個非常大的集合,你正在迭代和性能是你的關鍵決策驅動程序(記住,除非這些數字很大,否則這些數字不會被注意到),那麼您可能需要考慮並行化代碼。然後區別可能不是對於foreach,但Parallel.For與Parallel.Foreach與PLINQ(AsParallel()方法)。你有不同的線程來解決這個問題。

編輯:在生產應用程序中,您很可能會在循環中使用某些邏輯,這需要>>>時間來迭代項目。一旦你添加到混合性能驅動程序通常轉向實際的邏輯沒有優化迭代(編譯器做得很好)。

+0

成千上萬的迭代不太可能足夠的開銷是顯而易見的。您可能需要重複數十億甚至數億次,即使不是數十億次,才能真正發現差異。 – Servy 2013-03-18 15:57:41