【发布时间】:2016-07-10 17:41:08
【问题描述】:
这是我写的:
var max = 0xffffff * 4;
var step = 1 / max;
function cube() {
var result = 0.;
for (var x = 0.; x < 1; x += step) {
result += x * x * x;
}
return result;
}
function mul() {
var result = 0.;
for (var x = 0.; x < 1; x += step) {
result += x * x;
}
return result;
}
function go() {
var r = '';
r += cube() + ' \n';
r += mul() + ' \n';
alert(r);
}
并在 Chrome 分析器中查看结果:
mul: 106ms
cube: 87ms
这怎么可能?
【问题讨论】:
-
在
go()中交换调用顺序是否也更快? -
与其使用 Chrome 分析器,不如尝试使用 Performance API developer.mozilla.org/en-US/docs/Web/API/Performance/now
-
我得到了相同的结果,但如果我先执行
mul()然后cube()我得到mul()更快。它发生在其他人身上吗? -
在chromium.googlesource.com/v8/v8.git 浏览了当前的V8 源代码(Chrome 的JS 引擎) - 发现:a) 解释器或指令选择器没有将
x*x*x收缩为pow(x,3)或exp(n*log(x))b) Float64Mul 操作码生成非常复杂,并带有特殊情况处理(+/-0.5、1.0、...)和依赖于平台/架构的修饰,因此这个 Q 将是一个非常难以破解的坚果。