在我看来,基于函数的迭代会稍微慢一些,因为 1) 函数本身的开销,2) 创建和执行 N 次回调函数的开销,以及 3)范围链中的额外深度。但是,我想我会为踢球做一个快速的基准测试。结果证明,至少在我的简单测试用例中,基于函数的迭代更快。这是代码和结果
测试基准代码
// Function based iteration method
var forEach = function(_a, callback) {
for ( var _i=0; _i<_a.length; _i++ ) {
callback(_a[_i], _i);
}
}
// Generate a big ass array with numbers 0..N
var a = [], LENGTH = 1024 * 10;
for ( var i=0; i<LENGTH; i++ ) { a.push(i); }
console.log("Array length: %d", LENGTH);
// Test 1: function-based iteration
console.info("function-base iteration");
var end1 = 0, start1 = new Date().getTime();
var sum1 = 0;
forEach(a, function(value, index) { sum1 += value; });
end1 = new Date().getTime();
console.log("Time: %sms; Sum: %d", end1 - start1, sum1);
// Test 2: normal for-loop iteration
console.info("Normal for-loop");
var end2 = 0, start2 = new Date().getTime();
var sum2 = 0;
for (var j=0; j<a.length; j++) { sum2 += a[j]; }
end2 = new Date().getTime();
console.log("Time: %sms; Sum: %d", end2 - start2, sum2);
每个测试只是对数组求和,这很简单,但可以在某种现实生活场景中真实地看到。
FF 3.5 的结果
Array length: 10240
function-base iteration
Time: 9ms; Sum: 52423680
Normal for-loop
Time: 22ms; Sum: 52423680
事实证明,在这个测试用例中,基本的 for 迭代更快。我还没有看过视频,但我会看一下,看看他是否在某个地方有所不同,这会使基于函数的迭代变慢。
编辑:这绝不是最终结果,只是一个引擎和一个测试用例的结果。我完全预期结果会相反(基于函数的迭代速度较慢),但有趣的是看看某些浏览器是如何进行优化的(可能是也可能不是专门针对这种 JavaScript 风格的),因此反之亦然。