11

我不相信 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 循环,其中没有任何操作,因此如果有一些真实代码,它会掩盖运行时间。

4

3 回答 3

10

我修改了您的代码以更公平。你能看看吗?

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% 的原始数字运算,因此某些浏览器对基准进行了不公平的优化。

于 2012-03-17T02:40:35.597 回答
5

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

显然它们实际上是相同的。

因此,当进行真正的计算时,for vs forEach没关系。其他因素对性能的影响要大得多。特别是在运行时应用了优化之后。

于 2016-05-20T07:30:02.193 回答
-1

该站点显示了各种 JavaScript 循环方法的结果http://www.jsbenchmarks.com/?anywhichway/loop/master/benchmark.js。如果您选择运行基准测试,结果是运行基准测试的所有站点访问者与您自己的比较的平均值。

于 2017-01-05T16:28:17.527 回答