2014-03-29 106 views
0

所以,我已經看到了這段代碼在很多地方:JavaScript數組遍歷 - 效率

for (var i = 0, len = myArray.length; i < len; i++) { 

} 

我知道是數組的長度緩存。

今天我看到這一點:

var len = myArray.length; var i = 0; while(i++ < len)

效率明智的,這兩個是相同的,對不對?任何輸入將不勝感激。

+0

遞減速度更快。 Var i = myArray.length-1; while(i - ){// code here}。看看這裏 - http://stackoverflow.com/questions/1340589/javascript-are-loops-really-faster-in-reverse –

+2

http://jsperf.com/javascript-array-length –

+0

真棒......那幫助...感謝吉祥物! – pj013

回答

0

設置一個jsperf測試用例這裏:

http://jsperf.com/javascript-array-length

for (i = 0; i < arr.length; i++) { 
    //nothing 
} 

var arrlength = arr.length; 

for (i = 0; i < arrlength; i++) { 
    //nothing 
} 

var arrlength = arr.length, 
    i = 0; 

while (arrlength > i++) { 
    //nothing 
} 

var arrlength = arr.length; 

while (arrlength--) { 
    //nothing 
} 

如果測試用例可以改進,請讓我知道在評論中。通過少量測試,似乎IE11針對while案件進行了更好的優化,而Chrome 31似乎更喜歡第二個for循環(與while案例非常相似)。

+0

確切地說,這就是我要提出的,不同的瀏覽器基於循環顯示不同的表現,我猜想它是做出正確的選擇。 – pj013

+0

在你的forwards while循環中,你從'1'迭代到'arr.length'(包含),而不是從'0'到'arr.length-1'(包含)。 – Oriol

+0

@Oriol - 雖然我不認爲它會產生顯着的差異,但我已經修改了該測試。 –

0

如果您有一個「正常」循環,您還可以將i < len更改爲i !== len。這使循環更快,因爲檢查不平等是非常快的。變量的緩存並不重要,但它沒有任何傷害。

因此JavaScript快速循環可以寫成如下:

for (var i = 0, len = myArray.length; i !== len; i++) { 

} 

UPDATE

我做了一些性能測試前一陣子,這是我發現了什麼。但是現在的瀏覽器並沒有表現出相同的行爲,而且相反(<!==更快)。下面是測試我剛纔所說:http://jsperf.com/loop-inequality-check

所以,不要擔心張貼以上;)