网站搜索

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;
});

...在某些引擎上性能差异消失,而在另一些引擎上则相反(声明更慢)。后者可能是因为引擎在测试过程中发现它可以内联函数,或者至少可以跳过一些在使用声明时无法跳过的步骤。