【问题标题】:Javascript foreach loop performanceJavascript foreach 循环性能
【发布时间】:2015-03-21 00:33:35
【问题描述】:

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

我惊讶地发现这段代码:

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

比这个表现更好。

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

这些不完全一样吗?是什么让第一个代码 sn-p 比第二个代码快?

【问题讨论】:

标签: javascript performance-testing


【解决方案1】:

你的测试有问题。您的测试是:

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

对比

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

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

【讨论】:

  • 不过,提前声明函数更快!
  • @Jonathan:是什么让你这么想?如果您只创建一次而不是重复创建函数,则声明与表达式并不重要模内联(请参阅我添加到答案中的 Davin 更新的结果)。
  • 谢谢!但是,每次创建函数的代码都会为多个数组多次调用,从而使性能更差。我创建的测试反映了我的生产环境及其设置方式:)
  • @GETah:是的。创建函数需要非零时间。如果您可以创建函数一次并重用它,那当然会更快。
  • @T.J.Crowder:我分叉了测试并创建了另一个测试,我将匿名函数命名为传递给forEach。它的执行速度比匿名的快。我无法理解背后的原因。这是测试链接:jsperf.com/for-vs-foreach/272
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2016-01-12
  • 2017-07-14
  • 2014-05-18
  • 2013-04-04
相关资源
最近更新 更多