[ASP.NET] for loop 與 foreach

  • 6428
  • 0

[ASP.NET] for loop 與 foreach

最近在整理一些Code,於是乎for跟foreach到底誰好的話題又浮了上來

根據『編寫高質量代碼-改善C#程序的157個建議』及『Effective C#』均

建議在無其它額外考量之下,應優先選擇以foreach取代for loop。

 

然而從效能角度來看,究竟for跟foreach誰佳,老實說到目前為止我並沒有

明確的答案,這個議題從網路現有資訊來看各有支持者,也各有各自的證明

方法,常見的就是以一個int [ ]陣列做比較。

 

但我認為這似乎有點偏頗,於是我分別以List<T> 、Dictionary<>、ArrayList

及Array四者分別小測了一下,元素數量設定在1000000,分別RUN了10回合

所測得的數據如下(單位:毫秒)

 

image

 

可以看到在List<T>的部份,foreach確實所耗成本與for loop相比之下有明顯的優勢

,但在其它三者的部份卻幾乎是較差的。

 

進一步細看il檔,foreach在處理泛型及陣列細部上是不太一樣的

[泛型]

image

 

[陣列]

image

 

此外對於同屬於泛型集合類的List<T>及Dictionary<>雖然在il檔看起來處理手法是一致

的,但與for loop的效能比較上卻呈現不同的結果,這部份個人認為應該是在更內層實作

System.Collections.IEnumerable.GetEnumerator上的差異有關(僅止於個人推測,僅供參考)

 

結論:

雖然實測的結果是如此,但就像是做研究一樣,這樣的結果僅止於該測試所設置的環境以及

來源資料,對於for跟foreach到底誰好的問題,個人依然持保留態度,不過撇開這個部份的話

,我們仔細看一下il檔中foreach在處理泛型集合類時,其內部可以觀察具有try finally區段,而

另外也對於有實作IDisposable介面進行Dispose()動作

image

除此之外採用foreach能確保可以巡覽所有的元素,使用for loop則容易因coding上的miss

而造成未巡覽完所有的元素,例如:寫成int i=1起跑之類的 。因此除非真的在run time時

發生實際上效能的issue,不然個人其實還是比較推薦採用foreach來進行巡覽。

 

 

備註:本文中的測試不見得精確,此外對於資料來源型別不同的問題也並未加以深入探討,故

測試結果僅供參考,並不足以擴大解釋之。

 

備註2:採用foreach進行巡覽時是唯讀狀態,亦即無法在foreach中改變集合的內容

 

 

 

 

 

 

Ref :

FOREACH Vs. FOR (C#)

To foreach or not to foreach that is the question.

foreach, in (C# 參考)

Iterator (C# 程式設計手冊)

IEnumerable<T>.GetEnumerator 方法

IEnumerator<T>.Current 屬性

System.Collections.Generic

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18