2013-04-18 57 views
2

我目前正在編寫一個小框架來測試JavaScript函數的速度。當我反覆呼籲用相同的參數相同的方法,它給了我奇怪的結果:如果重複多次,JavaScript是否緩存/優化代碼?

Function   Execution Time 

isEvenBitwise  38.00000000046566 
isEvenModulo  38.00000000046566 
isEvenPointless 38.00000000046566 

這裏是我的功能:

var myFunctions = 
{ 
    isEvenBitwise: function(number) 
    { 
     return !(number & 1); 
    }, 
    isEvenModulo: function(number) 
    { 
     return (number % 2 == 0); 
    }, 
    isEvenPointless: function(number) 
    { 
     return 1; 
    } 
} 

運行該函數的代碼:

PerformanceTest.prototype.measureTime = function() 
{ 
    for (var indexTests = 0; indexTests < this.testCount; indexTests++) 
    { 
     var results = []; 

     for (var currentFunction in this.functions) { 
      var contextFunction = this.functions[currentFunction]; 

      var startTime = performance.now(); 
      for (var i = 0; i < this.iterationsPerTest; i++) 
      { 
       var heh = contextFunction.apply(this, arguments) 
      } 
      var executionTime = performance.now() - startTime; 

      var result = {}; 
      result.testName = currentFunction; 
      result.executionTime = executionTime; 
      results.push(result); 
     } 

     this.testResults.push(results); 
    } 
} 

JavaScript解釋器緩存/優化我的代碼嗎?如果是這樣,它是如何工作的?或者還有什麼事情我不知道?

編輯:這似乎只發生在Chrome,火狐只是罰款與這些結果:

Function   Execution Time 

isEvenBitwise  9.652258097220447 
isEvenModulo  37.546061799704376 
isEvenPointless 8.512472488871936 
+0

你能展示計算執行時間的代碼嗎?這是最可能的問題。即使使用緩存,您也無法獲得達到該精度的完全相同的執行時間。 – JJJ

+0

你是否在每個瀏覽器上得到相同的結果? – glenatron

+0

@glenatron不,請檢查我的編輯。 – dislick

回答

0

看你的代碼,我會做一個猜測,Chrome的聰明你是什麼之後這樣做。它看到的是:

var startTime = performance.now(); 
for (var i = 0; i < this.iterationsPerTest; i++) 
{ 
     var heh = contextFunction.apply(this, arguments) 
} 
var executionTime = performance.now() - startTime; 

這是正確評估該contextFunction沒有副作用,認識到heh變量只存在於循環範圍之內,並且從未使用過,然後優化整個循環了,因爲它不」不要做任何事情。

+0

我喜歡這個猜測,但是即使做了'var a = performance.now(); var end = performance.now() - a;'沒有給出與此一致的結果,因此日誌記錄中會出現一些令人感興趣的內容... –

+0

刪除了循環後,您會有兩個相鄰的調用性能。現在()。我會打賭Chrome也在優化這些。據我所知,它是最接近優化的Javascript引擎,所以它幾乎可以使用所有可以想到的技巧來獲得這種速度。 – glenatron

+0

你怎麼建議這種優化發生而不產生零結果? –