Javascript foreach循环性能

Javascript foreach循环性能,javascript,performance-testing,Javascript,Performance Testing,我正在考虑改进一些for-each循环,并创建了一个测试基准来比较我们使用它们的不同方式。测试可以是 我惊讶地发现以下代码: function add(val) { sum += val; } values.forEach(add); 性能比这个好 values.forEach(function(val) { sum += val; }); 这些不是完全一样吗?是什么使第一个代码段比第二个代码段快?这是测试中的一个问题。你的测试是: values.forEach(add);

我正在考虑改进一些for-each循环,并创建了一个测试基准来比较我们使用它们的不同方式。测试可以是

我惊讶地发现以下代码:

function add(val) {
   sum += val;
}
values.forEach(add);
性能比这个好

 values.forEach(function(val) {
   sum += val;
  });

这些不是完全一样吗?是什么使第一个代码段比第二个代码段快?

这是测试中的一个问题。你的测试是:

values.forEach(add);

在第二个测试中,您正在计时函数的创建以及
forEach
的执行。在第一个测试中,您没有对函数的创建进行计时;这是在测试的设置阶段完成的,这不是定时的

创建:

vs

…在某些发动机上,性能差异消失,而在某些发动机上则相反(速度较慢)。(后者可能是引擎在测试过程中发现它可以内联函数,或者至少跳过一些不能通过声明跳过的步骤。)


在我的电脑上,这两个函数的速度都很快。在.055和.053秒内都是56倍,因为函数声明通常比函数表达式快:。@AaditMShah这很有趣!不过,值得注意的是,提前声明函数会更快@乔纳森:你怎么会这么想?如果您只创建一次函数,而不是重复创建,那么声明与表达式之间的模内联并不重要(请参阅我添加到答案中的Davin更新的结果)。谢谢!但是,对于多个数组,每次创建函数的代码都会被多次调用,这使得性能更差。我创建的测试反映了我的生产环境及其设置方式:)@GETah:是的。创建函数需要非零时间。如果您可以创建一次函数并重用它,那么当然会更快。@T.J.Crowder:我进行了分叉测试,并创建了另一个,其中我将匿名函数命名为传递给
forEach
。它的执行速度比匿名的快。我不明白背后的原因。以下是测试的链接:
values.forEach(function(val) {
  sum += val;
});
function add(val) {
 sum += val;
}
values.forEach(add);
values.forEach(function(val) {
  sum += val;
});