在.NET中,「 for」或「 foreach」哪一個循環運行得更快?

在C#/ VB.NET / .NET中, forforeach哪一個循環運行得更快? web

自從我很早之前就讀過for循環比foreach循環的運行速度更快以來,我就認爲它適用於全部集合,通用集合,全部數組等。 數組

我搜尋了Google並發現了幾篇文章,但其中大多數沒有定論(閱讀文章評論)且開放式。 性能優化

理想的狀況是列出每一個方案,併爲它們提供最佳解決方案。 網絡

例如(僅做爲示例): 併發

  1. 對於迭代1000+字符串數組- for好過foreach
  2. 用於遍歷IList (非通用)字符串foreachfor更好

在網上找到了一些相同的參考資料: asp.net

  1. Emmanuel Schanzer撰寫的原始宏大的舊文章
  2. CodeProject FOREACH與。 對於
  3. 博客-要foreach或不foreach ,這是個問題
  4. ASP.NET論壇-NET 1.1 C# for vs foreach

[編輯] 性能

除了可讀性以外,我對事實和數據真的很感興趣。 在某些應用程序中,壓縮性能優化的最後一步很重要。 學習


#1樓

Jeffrey Richter在TechEd 2005上: 測試

「多年來,我已經開始學習C#編譯器對我來講是個騙子。」 ..「這取決於不少事情。」 ..「就像當您執行一個foreach循環時同樣...」 ..「 ...那是您編寫的一小段代碼,可是C#編譯器爲了作到這一點而吐出的東西倒是驚人的。 try / finally塊,在finally塊內,將變量轉換爲IDisposable接口,若是轉換成功,則在其上調用Dispose方法,在循環內,它在循環內重複調用Current屬性和MoveNext方法,對象在幕後建立。不少人使用foreach,由於它很是容易編碼,很容易作..「 ..」 foreach在性能上不是很好,若是您遍歷集合而不是使用正方形括號表示法,只是作索引,這要快得多,並且不會在堆上建立任何對象...」 優化

點播網絡廣播: http : //msevents.microsoft.com/CUI/WebCastEventDetails.aspx? EventID=1032292286& EventCategory=3& culture= en -US&CountryCode= US


#2樓

for循環相比for foreach循環表現出更具體的意圖

使用foreach循環會向使用您的代碼的任何人證實您計劃對集合的每一個成員執行某項操做,不管其在集合中的位置如何。 它還顯示您沒有修改原始集合(若是嘗試修改,則會引起異常)。

的另外一個優勢foreach是,它適用於任何IEnumerable ,其中做爲for惟一有意義IList ,其中每一個元素實際上有一個索引。

可是,若是您須要使用元素的索引,那麼固然應該容許您使用for循環。 可是,若是您不須要使用索引,那麼擁有索引只會使您的代碼混亂。

據我所知,對性能沒有重大影響。 在未來的某個階段,使用foreach修改代碼以在多個內核上運行可能會更容易,可是如今沒必要擔憂。


#3樓

在使用對象集合的狀況下, foreach更好,可是若是增長數字,則for循環會更好。

請注意,在最後一種狀況下,您能夠執行如下操做:

foreach (int i in Enumerable.Range(1, 10))...

可是它的性能確定不會更好,實際上與for相比,它的性能更差。


#4樓

二者將以幾乎徹底相同的方式運行。 編寫一些代碼以同時使用它們,而後向他顯示IL。 它應該顯示可比的計算,這意味着性能沒有差別。


#5樓

每當有關於性能的爭論時,您只須要編寫一個小型測試便可使用定量結果來支持您的案例。

使用StopWatch類,並重復幾百萬次,以確保準確性。 (若是沒有for循環,這可能很難):

using System.Diagnostics;
//...
Stopwatch sw = new Stopwatch()
sw.Start()
for(int i = 0; i < 1000000;i ++)
{
    //do whatever it is you need to time
}
sw.Stop();
//print out sw.ElapsedMilliseconds

手指越過該結果代表,這種差別能夠忽略不計,您最好仍是在可維護性最高的代碼中執行任何結果

相關文章
相關標籤/搜索