for循环vs for jach javascript中的性能和jsperf结果的可信度
作者:互联网
我不相信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中的循环快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优化器optimezes forEach循环没有动作,因此如果有一些真正的代码,则会模糊运行时间.
解决方法:
我修改你的代码更公平.你能看看吗?
var arr = [];
for (var i = 0; i < 100000; i++) arr[i] = i;
var numberOfRuns = 100;
function runTest(name, f) {
var totalTime = 0;
console.time(name);
for (var r = 0; r < numberOfRuns; r++) {
f();
}
return console.timeEnd(name);
}
function testFunction(v) {
v;
}
var forTime = runTest('for', function() {
for (var j = 0; j < arr.length; j++) {
testFunction(arr[j]);
}
});
var forEachTime = runTest('forEach', function() {
arr.forEach(testFunction);
});
您的测试不是100%原始数字运算,因此某些浏览器对基准测试进行了不公平的优化.
标签:javascript,performance,jsperf 来源: https://codeday.me/bug/20190929/1829811.html