2013-02-01 42 views
5

我在玩一些JavaScript性能優化,發現了一些有趣的東西。下面是代碼:性能:在對象命名空間vs本地數組中使用數組

function gObject() { 

    this.obj = []; 
    this.LIMIT = 100000; 

    this.doLoopLocal = function() { 
     var o = []; 
     for (var i=0;i<this.LIMIT;i+=1) { 
      o.push(i); 
     } 
     return o; 
    };  

    this.doLoopObject = function() { 
     this.obj = []; 
     for (var i=0;i<this.LIMIT;i+=1) { 
      this.obj.push(i); 
     } 
    }; 
}; 

var g = new gObject(); 

console.time('Using Local array'); 
g.doLoopLocal(); 
console.timeEnd('Using Local array'); 

console.time('Using Object array'); 
g.doLoopObject(); 
console.timeEnd('Using Object array'); 

當我運行它,日誌告訴我,使用本地陣列比使用的對象命名空間中定義數組慢。差異是顯着的 - 8至10倍! (FF 18.0.1)

Using Local array: 16ms 
Using Object array: 2ms 

截圖:enter image description here

我總是假設使用函數內局部定義的對象比較快,但是這個實驗表明我錯了。爲什麼會發生這種情況?

更新:我試過的腳本在當地的Firefox的控制檯和數字的東西,我希望在首位:使用本地陣列使用對象數組勝過。所以真正的原因是Firebug出於某種原因歪曲了數字並顯示不正確的結果。要記住的事情。

+0

我將這段代碼粘貼到我的控制檯中,並且本地數組耗時2毫秒,對象數組耗時3毫秒..有趣。如果您交換訂單,運行當地第二? –

+0

我也在Chrome中運行了這個功能,第一次使用「使用本地數組:1.675ms 使用對象數組:3.585ms」。在重複相同的代碼三次後,我得到「使用本地數組:2.316ms 使用對象數組:1.673ms」。更有趣... –

+0

本地陣列耗時1ms,對象陣列在我的Chrome中耗時6ms。 –

回答

1

一如既往的神奇,魔術在於相信它發生的眼睛。
你在這裏測試的方式是什麼?如果我們忘記了,在你的doLoopObject中,你不會返回this.obj,只是幾次測試表明結果是「隨機的」,甚至更糟糕:如果你顛倒測試的順序,它們可能會根據瀏覽器而改變。 結果將取決於您在兩次點擊之間等待的時間。如果你等幾秒鐘,他們將永遠是平等的。
現在,在JSPerf上,注意數據的增長速度,特別是在Firefox上,解釋變得非常明顯:定期減速:垃圾收集器由這種垃圾創建函數觸發。當它觸發時,數字會增加得更慢,可能是對象或局部變量(這並不重要)。 這裏測量的是垃圾收集器的時間,而不是與局部變量相比,對象屬性上的push()時間。這就解釋了爲什麼順序和測試之間的時間會改變事情。
我會補充說兩個測試之間的變化太大了,無法得出任何結論。

但最重要的是,足以等待的時候,這兩個測試執行對FF/Safari瀏覽器一樣的...

,你可以從所有這一切得出的唯一結論是:這兩種方法執行相同的。

但由於分配的人那麼多「堆」無論如何都會分配一次,使用簡單myArray的[lastIndex的-1] = 0,恐怕真正的結論是:這個測試說明不了什麼。