|
|
|
|
|
我做了一個小實驗來證明 for
循環(huán) 與 foreach
循環(huán)速度快慢的觀點。
我在 SQL Server 數(shù)據(jù)庫中有一個名為 accounts 的表,我在該表中添加了 20,000 行,其中包含 9 列,每條記錄大約有 1 KB 的數(shù)據(jù)。加載到我的業(yè)務(wù)層后,我將其轉(zhuǎn)換回 DTO 并返回到我的 Web 服務(wù)。只是為了測試性能,我添加了兩個性能計數(shù)器——一個用于foreach
循環(huán),一個用于for
循環(huán)。結(jié)果很明顯。foreach
循環(huán)執(zhí)行相同的過程需要 107 毫秒,而經(jīng)典的 for
循環(huán)需要 14 毫秒。
為什么會這樣?讓我們更深入一點。
for
循環(huán)版本只為兩個局部變量(counter 和 i)使用了足夠的堆??臻g。而 foreach
版本為四個局部變量(item、AccountList 對象和兩個編譯器生成的臨時對象)使用堆??臻g。
當(dāng)在 CLR 中調(diào)用方法時,局部變量所需的所有內(nèi)存都分配在堆棧上。由于這是在堆棧上進(jìn)行的,因此這個過程很快但不是免費的。這就是 foreach
循環(huán)由于其額外的兩個局部變量而產(chǎn)生少量成本的原因。
等等?。?!
還有其他改變效果的東西。
如果我們在for
循環(huán)和foreach
循環(huán)中多次使用局部變量,看看會發(fā)生什么。
結(jié)果逆轉(zhuǎn)了。
可見,如果我們必須在 for
循環(huán)中多次訪問局部變量值,在這種情況下,性能會下降。
結(jié)論
foreach
循環(huán)速度更快,因為存儲數(shù)組中元素值的局部變量比訪問數(shù)組中的元素更快。
如果每次迭代只能訪問一次數(shù)組,則 for
比 foreach
循環(huán)更快。
相關(guān)文章