2015-06-19 80 views
-2

如果我做了類似以下的事情,這是否被認爲是不理想的(性能明智的)?這些有效的循環優化?

// Is this optimal? 
foreach (var fruit in basket.Fruits()) 
{ 
    // .... 
} 

// What about this? 
for (var i = 0; i < basket.Fruits().length; ++i) { 
    // .... 
} 

// Alternate way. 
var fruits = basket.Fruits(); 
foreach (var fruit in fruits) 
{ 
    // .... 
} 

我正在尋找適用於.net以及Javascript的答案。

謝謝。

+0

用100000個水果創建測試並檢查兩種情況下的時間差。 – BaBL86

+1

我不認爲會有差異。編譯器會做這樣的優化。如果你認爲在第一次循環中必須在每次迭代中獲得水果。不,它不是 –

+2

問題是......你以後需要在籃子裏的水果嗎? – MinusFour

回答

2

兩者都具有同樣的性能。 basket.Fruits()返回一個對象,JavaScript將爲該對象創建一個迭代器。

另一種解決方案是使用

Object.keys(basket.Fruits()).forEach(function(fruit) { 
    // ... 
}); 

無論哪種方式,不注重這種優化。 JavaScript速度很快,並且有很多自動優化。你應該專注於讓你的代碼儘可能清晰易讀。完成之後,如果發現速度較慢,請專注於優化該部分。


根據您的編輯,你可以存儲在循環的初始化表達式中的變量數組的長度。然後謂詞表達式可以比較i<len而不是計算每次迭代的數組長度。

for (var i=0; len=basket.Fruits().length; i<len; i++) ... 
+0

這樣的事情呢?(見上面的編輯)。 – AlvinfromDiaspar

+0

謝謝你簡潔地回答這個問題,而不是玩「政治」。 – AlvinfromDiaspar