代码之家  ›  专栏  ›  技术社区  ›  ALTN

为什么Firefox执行Javascript的速度比其他浏览器快得惊人

  •  4
  • ALTN  · 技术社区  · 9 年前

    我正在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();

    结果如下:

  • Firefox下的0.12s ,当我替换 f(x) 拜访 Math.sin(x) .
  • 铬下5.2s ,当我替换 f(x) 拜访 数学sin(x) .
  • Safari下的7.12s 但令人惊讶的是 0.56s 当我替换 f(x) 拜访 数学sin(x) .
  • 这使得Firefox比Chrome快约50倍,比Safari快约70倍,有任何已知的原因吗?

    同样,在Safari下,为什么直接调用 数学sin(x) f(x) 呼叫

    1 回复  |  直到 9 年前
        1
  •  3
  •   ALTN    9 年前

    正如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仍然注意到未使用的返回值,并省略了函数调用。在以下情况下,执行时间为0.12s: y 它仍然未使用。

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

    Safari似乎也认识到了这一点。罪是纯洁的,执行 直接使用时的优化相同,但不会扩展到 在这种情况下为f。