正如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。