Javascript 为什么复杂循环和许多循环之间存在如此巨大的性能差异

Javascript 为什么复杂循环和许多循环之间存在如此巨大的性能差异,javascript,performance,loops,for-loop,Javascript,Performance,Loops,For Loop,我正在为一个项目做一些快速循环,我决定做一个简单的测试,看看在比较运行一个更复杂的内部循环与运行几个简单的内部循环时,性能是如何变化的。以下是它的jsperf: 我很惊讶这种差异看起来有多大 任何人都可以指出我的测试不好的原因(很可能是这样),或者解释性能差异的原因 谢谢 idb在第一种情况下,调用一个迭代器函数100次。在第二种情况下,调用10个迭代器函数100次。这是函数调用数量的10倍。我认为开销是造成差异的原因。我认为您的测试存在一个苹果对橘子的问题-在第一个测试中,您循环整数数组1*

我正在为一个项目做一些快速循环,我决定做一个简单的测试,看看在比较运行一个更复杂的内部循环与运行几个简单的内部循环时,性能是如何变化的。以下是它的jsperf:

我很惊讶这种差异看起来有多大

任何人都可以指出我的测试不好的原因(很可能是这样),或者解释性能差异的原因

谢谢


idb在第一种情况下,调用一个迭代器函数100次。在第二种情况下,调用10个迭代器函数100次。这是函数调用数量的10倍。我认为开销是造成差异的原因。

我认为您的测试存在一个苹果对橘子的问题-在第一个测试中,您循环整数数组
1*100次,总共执行100次函数(执行
doSomething
函数10次,总共执行1000次)

第二个case在整数数组上循环
10*100
次,总共执行1000次10个匿名函数,每个匿名函数调用
doSomething
函数一次。遍历一个100项数组10次比遍历一次要花费更多的时间。创建10个匿名函数并分别调用100次肯定比创建一个匿名函数并调用100次开销更大。这两件事的结合使你的测试完全不同

请尝试以下方法:

function doSomething(a) {
  a * 10 + a * 1000000.0 / 50.0;
}
var range = _.range(100),
    total_runs = _.range(10);
_.each(total_runs, function(a) {
    _.each(range, doSomething);
});

我不知道为什么需要underline.js和jQuery。我写了一篇比较:

  • 100个循环,10个循环,每个循环1个调用(1000个调用)
  • 10次呼叫的100次循环(1000次呼叫)
  • 200个循环,共5次呼叫(1.000次呼叫)
  • 1000次循环1次呼叫(1000次呼叫)
  • 它们的性能都非常相似


    我认为你的问题是,第一种情况是100个匿名函数,每个函数进行10次调用。第二个是1000个匿名函数,每个函数进行一次调用。创建匿名函数时可能会产生开销(尽管我没有查看正在使用的库的相关内部部分)。

    我得到了一个
    ReferenceError:\uu未定义。
    在您链接的页面中。我认为遍历数组不需要太多时间,它似乎得到了高度优化。它可能是需要额外工作的匿名函数数量的10倍,因此需要更长的时间。@RobG--可能。我敢打赌,这更多地是因为
    \每个
    调用它每次在可选上下文对象上下文中传递的函数,并对每个循环进行一些额外的检查。这种嵌套循环永远不会战胜更严格优化的(可读的、更特定于用例的)代码。(请参阅:),但只有探查器才能给我们一个确定的最终答案。:-)谢谢RobG-我现在看到了我测试的问题!我之所以使用下划线.js,是因为它是我常用的库,而且我对它很熟悉。我不认为迭代器有那么重,但我不太确定。