2011-10-06 22 views
0

優化的JavaScript所以我有known一會兒即for循環

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

} 

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

} 

爲大陣列更有效。但是想知道前者真的會給你帶來多大的性能提升?

今天我開始做一些基準測試。我創建了一個數組並將100,000個數字推入其中。

var array = []; 
    for(var i = 0; i < 100000; i++) 
     array.push(i); 

然後,我通過對數組中的每個數字進行console.log測試,並對該過程進行計時,從而測試了上述兩個循環。

console.time('loop'); 

for(var i = 0; i < array.length; i++) 
    console.log(i); 

console.timeEnd('loop'); 

而對於第二個測試

console.time('loop'); 

for(var i = 0, len = array.length; i < len ;i++) 
    console.log(i) 

console.timeEnd('loop') 

測試了幾次後,我的結果是不確定的。這兩個測試用例都可以同時獲得最高和最低的數字。所以我的問題是,有什麼更好的測試來明確地表明,事先獲得長度會帶來性能上的好處,以及獲得什麼樣的百分比收益?

+0

有一個相當全面的jspef完成所有類型的循環,而對於post/pre increment/decrement。但目前我找不到它 – Joe

+0

但我想自己運行它:-) –

+0

您可能會發現[jsperf.com](http://jsperf.com)在這種情況下很有用。在這種情況下,我懷疑對console.log的調用完全支配整個運行時間。 – Pointy

回答

0

在這種情況下,它沒有任何區別。訪問數組的屬性是一個非常快速的操作,因爲每次數組更改時都會更新,因此您只需檢索一個數字。

但是,如果您正在循環說出通過document.querySelectorAll獲得的某些元素,那麼緩存結果可能是個好主意,因爲調用querySelectorAll可能會很昂貴,而且您不想運行它每次迭代如果結果不會改變。

0

從理論上講,兩個例子之間的速度實際上應該沒有任何差別。

第一個例子運行得更快的想法來自像php這樣的語言,因爲sizeof的數量是循環每次迭代時數組的長度,所以等價物將會是「$ i < sizeof($ array)」。與PHP不同的是,JavaScript已經知道它的數組有多長,所以你幾乎只是直接讀取數字。

結果是,在JavaScripts的情況下,閱讀「arrlen」和「somearray.length」之間的唯一區別就是指針指向的位置,所以速度幾乎相同。

這就是說,通過基準約瑟夫張貼的外觀,這是如何在引擎蓋下處理顯然不是那麼直截了當。在內聯15的情況下,實際上似乎更快,而在較早的幾個中,它慢一點? o.0