2010-12-06 44 views
0

可能重複:
For vs Foreach loop in C#這是更快:用於或的foreach

可以說,我有一個集合

名單<美孚>列表=新名單<富>();

現在其中foolowing迴路將運行得更快,以及爲什麼:

對(INT I = 0;我< list.Count;我++)

foreach(Foo foo in list)

+3

可能重複http://stackoverflow.com/questions/1124753/for-vs-foreach -loop-in-c – hallie 2010-12-06 08:28:39

回答

2

誰在乎?你有性能問題嗎?如果是這樣,你有沒有測量和確定這是你的應用程序中最慢的部分?

1

那麼..你可以使用System.Diagnostics.StopWatch找到。

然而問題是,你爲什麼需要考慮一下。您應該首先考慮哪一個更具可讀性並使用該版本,而不是在這種情況下困擾性能。

金科玉律總是寫可讀的代碼,如果你發現性能問題優化。

0

如果您需要使用當前項目的索引,使用for循環。沒有faster解決方案,您只有proper解決方案。

2

foreach比我鍵入更快:)並且更易於閱讀。

5

這取決於:

For循環,它是How much time does it take to evaluate the value of list.Count or whatever value is provided in conditionHow much time does it take to reference item at specific index

Foreach循環,這取決於How much time it takes for an iterator to return a value

爲了您上面的例子,因爲你使用的是標準的列表類不應該有任何區別。

-1

我沒有源來支持這一行動,但我相信他們將是幾乎如果不是完全相同,由於編譯器的優化,如展開循環的方式。如果存在差異,則可能是單個或數十個CPU週期的順序,對於99.9999%的應用程序而言,這是好的。

一般情況下,的foreach往往被視爲「語法糖」,也就是說,這是不錯的,但實際上並沒有做太多,除了改變你的字一個特定的代碼塊的方式。

1

嘗試這一點,和foreach幾乎導致相同的時間,但the.ForEach()方法更快

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Add values 
     List<objClass> lst1 = new List<objClass>(); 
     for (int i = 0; i < 9000000; i++) 
     { 
      lst1.Add(new objClass("1", "")); 
     } 

     //For loop 
     DateTime startTime = DateTime.Now; 
     for (int i = 0; i < 9000000; i++) 
     { 
      lst1[i]._s1 = lst1[i]._s2; 
     } 
     Console.WriteLine((DateTime.Now - startTime).ToString()); 

     //ForEach Action 
     startTime = DateTime.Now; 
     lst1.ForEach(s => { s._s1 = s._s2; }); 
     Console.WriteLine((DateTime.Now - startTime).ToString()); 

     //foreach normal loop 
     startTime = DateTime.Now; 
     foreach (objClass s in lst1) 
     { 
      s._s1 = s._s2; 
     } 
     Console.WriteLine((DateTime.Now - startTime).ToString()); 

    } 

    public class objClass 
    { 
     public string _s1 { get; set; } 
     public string _s2 { get; set; } 

     public objClass(string _s1, string _s2) 
     { 
      this._s1 = _s1; 
      this._s2 = _s2; 
     } 
    } 

} 
相關問題