为什么Firefox比其他浏览器更快地执行Javascript

时间:2017-01-01 22:49:52

标签: javascript google-chrome firefox safari performance-testing

我在Firefox,Chrome和Safari下测试以下Javascript代码段的性能



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

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

testSpeed();
&#13;
&#13;
&#13;

结果如下:

  • Firefox下的0.12秒,当我用f(x)替换Math.sin(x)来电时,情况相同。
  • 在chrome下的5.2s ,当我用f(x)替换Math.sin(x)来电时,情况相同。
  • 在Safari 下7.12s但令人惊讶的是,当我f(x)替换Math.sin(x)来电时,只有 0.56s
  • 这使Firefox比Chrome快50倍,比Safari快约70倍,有没有任何已知原因?

    同样在Safari下,为什么直接调用Math.sin(x)会产生巨大的差异(比f(x)调用快13倍?

    1 个答案:

    答案 0 :(得分:1)

    Ryan在评论中指出,Firefox实际上注意到该功能没有任何副作用,其返回值未被使用,从而安全地省略了呼叫。如下更改代码使Firefox执行增长到 4.1s

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

    请注意,如果没有在嵌套循环结束时记录y,Firefox仍会注意到未使用的返回值并省略了函数调用。当y未使用时,执行时间保持在0.12秒。

    至于为什么Safari在调用Math.sin(x)时速度更快我会引用Ryan的评论:

      

    Safari似乎也认识到Math.sin是纯粹的并执行   直接使用时的相同优化,但不会扩展到   f在这种情况下。