for循环与forEach性能在JavaScript和jsperf结果的可信度

我不相信jsperf衡量循环vs 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});

运行100万项目的测试具有相同的性能差异。 你能否告诉我如果我错过了一些东西,我应该相信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);
});

这是一个真正的测试:http://jsfiddle.net/ssSt5/57/(多次运行)

显然他们几乎是一样的。

所以当真正的计算正在进行时, for vs forEach就不重要了。 其他因素对性能影响更大。 特别是在运行时间应用优化之后。


本网站展示了全系列JavaScript循环方法的结果http://www.jsbenchmarks.com/?anywhichway/loop/master/benchmark.js。 如果您选择运行基准,结果是所有运行基准的网站访问者的平均值与您自己的平均值相比较。

链接地址: http://www.djcxy.com/p/64155.html

上一篇: for loop vs forEach performance in javascript and credibility of jsperf results

下一篇: javascript function scope, variable declaration