我不太相信 jsperf 上测试 for 循环和 forEach 方法的性能结果,至少在我的机器上,对于 Chrome 和 Firefox 来说,结果与 jsperf 上所宣传的完全不同。以下是我在 Ubuntu 11.10 上运行 Firefox 的测试结果:
http://jsperf.com/foreach-vs-loop (我自己的测试)
http://jsben.ch/#/BQhED(更受欢迎的测试)
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 比 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循环,因此如果有一些真正的代码,则会掩盖运行时间。
v;
优化为空,但仍然查找arr[j]
的值。 - ta.speot.isforEach
可以被优化得非常不同。你在问题中引用的数字也显示了相同的趋势。我真的不知道你的问题是什么。 - decezefor
循环和forEach
循环分别为6毫秒
和83毫秒
的结果。 - Blender