2008-10-09 46 views
0

從DataTable中讀取/比較行信息時,通常速度最快?.NET迭代數據表中行的最快方法?

'assume dt as datatable' 

'method 1' 
dim i as int32 
for i = 0 to dt.rows.count - 1 
    .... 
next 

'method 2' 
dim row as datarow 
for each row in dt.rows 
    .... 
next 

如果有區別,在什麼情況下使用一個在另一個上?

在此先感謝您的任何指導!

回答

6

編譯器將For Each擴展爲短while循環。

for each row in dt.rows 
// expands to: 
IEnumerator e = dt.rows.GetEnumerator() 
while e.MoveNext() 
    row = e.Current 

因此您支付少量的開銷。但是對於clarities而言,如果你只在一行上工作,並且你沒有修改數據集,我仍然堅持For Each。

2

實際上沒有區別。儘管您在技術上通過foreach方法支付了一小筆費用,但通過了IEnumerable接口。

+1

是的,在我的測試工具這兩種方法只顯示後約100K次迭代的性能差異的成本一篇有趣的文章。 – StingyJack 2008-10-23 11:56:10

3

第二個會有輕微的處罰。然而,至於情況,我堅持總是使用方法2來明確代碼。但是,如果我需要在分析當前行時執行諸如訪問下一個/上一個行等操作,我會使用方法1。

1

@ gdean232是對的 - 幾乎沒有任何區別。如果性能出現問題,使用SqlDataReader會更快。

-2

foreach實現實際上比實現標準稍快,因爲每個索引數組訪問都需要進行邊界檢查。然而,由於成語:

for(int i =0; i < myArray.Count; ++i) 
{ 
    // do something with myArray[i]; 
} 

是常見的,編譯器查找它作爲特殊情況並優化它,所以它變得更快。但是,與該格式的任何小偏差(例如int len = MyArray.Count; for(int i = 0; i < len; ++ i))將不會被識別,並會使用較慢的代碼。

2

那麼,有一個區別,因爲在foreach循環中調用的GetEnumerator和MoveNext是虛擬的(調用需要經過一個指針),因此不能內聯。這個開銷實際上很小,除非你做了一個循環的批次

在某些情況下,雖然編譯器會用for循環(我相信在迭代數組時)替換foreach。

爲了清晰起見,我個人比較喜歡foreach在我的ASP.NET MVC代碼中,正如許多人在這裏所說的,但也經常使用for循環。 喬·達菲最近發佈了關於枚舉 http://joeduffyblog.com/2008/09/21/the-cost-of-enumerating-in-net/

相關問題