2

我的性能測試火狐,Chrome和Safari在下面的JavaScript代碼段更快爲什麼火狐執行JavaScript居然比其他瀏覽器

var f = function(x) { 
 
\t return Math.sin(x); 
 
} 
 

 
function testSpeed() { 
 
\t console.log("test started, please hold on..."); 
 
\t var time = Date.now(); 
 
\t for(var i = 0; i < 1000; i ++) { 
 
\t \t for(var x = 1; x < 200000; x ++) { 
 
\t \t \t f(x);//replace by Math.sin(x) here 
 
\t \t } 
 
\t } 
 
\t console.log("total time = " + ((Date.now() - time)/1000.0)); 
 
} 
 

 
testSpeed();

的結果是:

  • 在Firefox下0.12s,當我用Math.sin(x)替換f(x)時,也是如此。
  • 5.2s在鍍鉻下,同樣當我用Math.sin(x)替換f(x)時。 Safari瀏覽器下
  • 7.12s但令人驚訝的唯一0.56s當我更換f(x)呼叫通過Math.sin(x)
  • 這使得Firefox比Chrome快50倍,比Safari快70倍,是否有任何已知的原因?

    同樣在Safari下,爲什麼直接撥打Math.sin(x)f(x)呼叫相比會產生巨大差異(快13倍)?

    +0

    有趣。甚至邊緣比鉻更快。得分:0.287 –

    +1

    完全刪除'f(x)'調用或刪除'f'的主體時,速度如何?由於它沒有效果,引擎可以合理地消除它。 – Ryan

    +0

    @Ryan沒有f(x)Firefox保持0.12s的執行時間,Chrome令人驚訝地降低到0.18s,Safari降到0.54s,由於某些原因,函數調用在Chrome和Safari下顯着影響性能 – ALTN

    回答

    1

    正如Ryan在評論中指出的那樣,Firefox實際上注意到這個函數沒有任何副作用,並且它的返回值沒有被使用,從而安全地省略了調用。更改代碼下面進行的Firefox執行長到4.1s

    var f = function(x) { 
     
    \t return Math.sin(x); 
     
    } 
     
    
     
    function testSpeed() { 
     
    \t console.log("test started, please hold on..."); 
     
    \t var time = Date.now(); 
     
    \t var y; 
     
    \t for(var i = 0; i < 1000; i ++) { 
     
    \t \t for(var x = 1; x < 200000; x ++) { 
     
    \t \t \t y = f(x); 
     
    \t \t } 
     
    \t } 
     
    \t console.log("total time = " + ((Date.now() - time)/1000.0) + " " + y); 
     
    } 
     
    
     
    testSpeed();

    注意,如果沒有在嵌套循環結束登錄y,火狐仍然發現未使用的返回值和省略函數調用。當y未被使用時,執行時間將保持在0.12s。

    至於爲什麼Safari瀏覽器調用Math.sin(x)的時候我就引述萊恩的評論去更快:

    Safari瀏覽器似乎也認識到,Math.sin是純粹的,當你直接使用它進行 相同的優化,但在這種情況下不會延伸到 。

    相關問題