Javascript foreach 循环性能
我正在考虑改进我们的一些 for each 循环,并创建了一个测试基准来比较我们使用它们的不同方式。测试可以在这里找到。
我很惊讶地发现这段代码:
function add(val) {
sum += val;
}
values.forEach(add);
比这个表现更好。
values.forEach(function(val) {
sum += val;
});
这些不正是一样的吗?是什么让第一个代码片段比第二个更快?
答案#1
这是你的测试有问题。你的测试是:
values.forEach(add);
和
values.forEach(function(val) {
sum += val;
});
在第二个测试中,你不仅计时函数的执行,还计时函数的创建。在第一个测试中,你没有计时函数的创建;这是在测试的设置阶段完成的,该阶段不计时。
Davin Tryon 创建了一个测试,用于在两种情况下创建这些函数:
function add(val) {
sum += val;
}
values.forEach(add);
对
values.forEach(function(val) {
sum += val;
});
...在某些引擎上性能差异消失,而在另一些引擎上则相反(声明更慢)。后者可能是因为引擎在测试过程中发现它可以内联函数,或者至少可以跳过一些在使用声明时无法跳过的步骤。
