我在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;
结果如下:
f(x)
替换Math.sin(x)
来电时,情况相同。 f(x)
替换Math.sin(x)
来电时,情况相同。f(x)
替换Math.sin(x)
来电时,只有 0.56s 。
这使Firefox比Chrome快50倍,比Safari快约70倍,有没有任何已知原因?
同样在Safari下,为什么直接调用Math.sin(x)
会产生巨大的差异(比f(x)
调用快13倍?
答案 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在这种情况下。