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是纯粹的,当你直接使用它进行 相同的优化,但在这种情况下不会延伸到 。

    相关问题