我正在为一个项目进行快速循环,我决定组合一个简单的测试来查看性能在比较运行更复杂的内部循环和运行几个简单的内部循环时如何变化。这是jsperf的测试链接:http://jsperf.com/nested-fors-vs-iterative-fors。我惊讶于差异的显著性。有人可以指出我的测试有问题吗(这很可能是情况),或者解释为什么存在性能差异吗?谢谢!
我认为你的测试存在着不可比较的问题 - 在第一个测试中,你循环遍历了整数数组1 * 100
共100次,总共执行了你的函数1000次(每个函数执行10次)。
而在第二个测试中,你循环遍历了整数数组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);
});
_.each
每次在可选上下文对象的上下文中调用传递给它的函数,并在每次循环中执行一些额外的检查,而嵌套循环这种情况永远不会胜过更紧密优化(即更具体使用案例)的代码。(参见:http://documentcloud.github.com/underscore/docs/underscore.html#section-12)但只有分析器才能给我们一个确定和最终的答案。 :-) - Sean Vieira