我不相信 jsperf 测量 for 循环与 forEach 性能的结果。至少对于我机器上的 chrome 和 firefox,结果与 jsperf 中宣传的完全不同。
http://jsperf.com/foreach-vs-loop(我的)
http://jsben.ch/#/BQhED(更受欢迎)
在我运行 Ubuntu 11.10 的笔记本电脑上,我在 Firefox 中得到以下结果:
for: total=1641 ms, avg=164.1 ms
forEach: total=339 ms, avg=33.9 ms
uname -a:
Linux 3.0.0-16-generic #29-Ubuntu SMP Tue Feb 14 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
不幸的是,Chrome 不会返回 console.timeEnd() 的结果,但运行时间是相同的,只是在 Chrome 中更快。我观察到 forEach 在 Chrome 中比 for 循环快 10 倍,在 Firefox 中快 3 倍。
在 Chrome 中,我大约得到以下运行时间:
for: avg=80 ms
forEach: avg=6 ms
这是我在 Firefox 和 Chrome 控制台中运行的代码。
var arr = [];
for(var i = 0; i < 100000; i++) arr[i]=i;
var numberOfRuns = 10;
function time(name, f){
console.time(name);
f();
return console.timeEnd(name);
}
function runTest(name, f){
var totalTime = 0;
for(var r = 0; r < numberOfRuns; r++)
totalTime += time(name,f);
return totalTime;
}
var forTime = runTest('for', function(){
for(var j = 0; j < arr.length; j++)
arr[j];
});
var forEachTime = runTest('forEach', function(){
arr.forEach(function(v){v;});
});
console.log('for', {total:forTime, avg:forTime / numberOfRuns});
console.log('forEach', {total:forEachTime, avg:forEachTime / numberOfRuns});
运行一百万个项目的测试具有相同的性能差异。您能否告知我是否遗漏了什么,我应该相信 jsperf 结果而不是我正在观察的真实结果?当然,我确实相信我现在可以在浏览器中看到的真实结果。
编辑:与@Blender 讨论时发现的测试场景并不客观。看起来 js 优化器优化了 forEach 循环,其中没有任何操作,因此如果有一些真实代码,它会掩盖运行时间。