[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回合
所測得的數據如下(單位:毫秒)
可以看到在List<T>的部份,foreach確實所耗成本與for loop相比之下有明顯的優勢
,但在其它三者的部份卻幾乎是較差的。
進一步細看il檔,foreach在處理泛型及陣列細部上是不太一樣的
[泛型]
[陣列]
此外對於同屬於泛型集合類的List<T>及Dictionary<>雖然在il檔看起來處理手法是一致
的,但與for loop的效能比較上卻呈現不同的結果,這部份個人認為應該是在更內層實作
System.Collections.IEnumerable.GetEnumerator上的差異有關(僅止於個人推測,僅供參考)
結論:
雖然實測的結果是如此,但就像是做研究一樣,這樣的結果僅止於該測試所設置的環境以及
來源資料,對於for跟foreach到底誰好的問題,個人依然持保留態度,不過撇開這個部份的話
,我們仔細看一下il檔中foreach在處理泛型集合類時,其內部可以觀察具有try finally區段,而
另外也對於有實作IDisposable介面進行Dispose()動作
除此之外採用foreach能確保可以巡覽所有的元素,使用for loop則容易因coding上的miss
而造成未巡覽完所有的元素,例如:寫成int i=1起跑之類的 。因此除非真的在run time時
發生實際上效能的issue,不然個人其實還是比較推薦採用foreach來進行巡覽。
備註:本文中的測試不見得精確,此外對於資料來源型別不同的問題也並未加以深入探討,故
測試結果僅供參考,並不足以擴大解釋之。
備註2:採用foreach進行巡覽時是唯讀狀態,亦即無法在foreach中改變集合的內容
Ref :
To foreach or not to foreach that is the question.
IEnumerable<T>.GetEnumerator 方法
By No.18