我正在考虑为每个循环改进一些,并创建一个测试基准来比较我们使用它们的不同方式。测试可以是found here。
我很惊讶地发现这段代码:
function add(val) {
sum += val;
}
values.forEach(add);
比这更好。
values.forEach(function(val) {
sum += val;
});
阿伦这些完全一样吗?是什么让第一个代码片段比第二个代码片段更快?
答案 0 :(得分:6)
这是您测试的问题。你的测试是:
values.forEach(add);
和
values.forEach(function(val) {
sum += val;
});
在第二个测试中,您将计算函数的创建时间以及forEach
的执行时间。在第一个测试中,您没有计算功能的创建时间;这是在测试的设置阶段完成的,没有定时。
Davin Tryon创建了a test that creates the functions in both cases:
function add(val) {
sum += val;
}
values.forEach(add);
VS
values.forEach(function(val) {
sum += val;
});
...其中性能上的差异在某些引擎上消失,而另一方面(声明更慢)则在某些引擎上消失。 (后者可能是引擎在测试过程中发现它可以内联函数,或者至少跳过一些无法通过声明跳过的步骤。)