Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中for-loop vs-forEach的性能和jsperf结果的可信度_Javascript_Performance_Jsperf - Fatal编程技术网

javascript中for-loop vs-forEach的性能和jsperf结果的可信度

javascript中for-loop vs-forEach的性能和jsperf结果的可信度,javascript,performance,jsperf,Javascript,Performance,Jsperf,我不相信jsperf测量for循环和forEach性能的结果。至少对于我的机器上的chrome和firefox,结果与在jsperf中发布的结果完全不同。 (我的) (更受欢迎) 在运行Ubuntu11.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

我不相信jsperf测量for循环和forEach性能的结果。至少对于我的机器上的chrome和firefox,结果与在jsperf中发布的结果完全不同。
(我的)
(更受欢迎)
在运行Ubuntu11.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中更快。我发现在Chrome中forEach比for loop快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});
var arr=[];
对于(var i=0;i<100000;i++)arr[i]=i;
var numberOfRuns=10;
功能时间(名称,f){
控制台。时间(名称);
f();
返回控制台。timeEnd(名称);
}
函数runTest(名称,f){
var totalTime=0;
对于(var r=0;r
为一百万个项目运行测试具有相同的性能差异。如果我遗漏了什么,你能告诉我应该相信jsperf结果而不是我观察到的真实结果吗?当然,我相信我现在可以在浏览器中看到的真实结果


编辑:与@Blender讨论时发现,测试场景并不客观。看起来js optimizer优化了forEach循环,没有任何操作,因此如果有一些真实的代码,它会模糊运行时间。

为了更公平,我修改了您的代码。你能看一下吗

var arr=[];
对于(var i=0;i<100000;i++)arr[i]=i;
var numberOfRuns=100;
函数runTest(名称,f){
var totalTime=0;
控制台。时间(名称);
对于(var r=0;r这是一个真正的测试:(运行多次)

显然,它们实际上是一样的


因此,当实际计算进行时,vs forEach的
并不重要。其他因素对绩效的影响要大得多。特别是在运行时应用了优化之后。

此站点显示了各种JavaScript循环方法的结果。如果您选择运行基准测试,则结果是运行基准测试的所有站点访问者与您自己的站点访问者的平均值。

jsPerf进行真正的测试。它使用的测试框架只是您的一个更复杂的版本。另外,确保考虑到不同浏览器的JS引擎。不是javascript开发人员,但我猜解释器正在优化
v
设置为nothing,但仍会查找
arr[j]
的值。jsperf的要点是演示相对性能差异。您仍然可以看到相同的相对性能。你们到底在怀疑什么?@blender那个么,若它们不能在真实场景中得到证明,那个么它们是什么样的真实测试呢?@ta.speot.is从两者中删除了arr[i]和v,并获得了稍好的for循环性能,但forEach仍然要快得多。在你们的小提琴中,for循环似乎要快得多。但是当我在开发人员控制台中运行相同的代码时,forEach每次都会赢。为什么会这样?@Kushagragor:不知道。问一个问题。嘿,2012年,2018年:现在两者都很相似。