这话我听过好几次了。JavaScript循环在向后计数时真的更快吗?如果有,为什么?我已经看到了一些测试套件示例,它们显示反向循环更快,但我找不到任何解释!

我假设这是因为循环不再需要在每次检查属性时评估它是否已经完成,它只检查最终的数值。

即。

for (var i = count - 1; i >= 0; i--)
{
  // count is only evaluated once and then the comparison is always on 0.
}

当前回答

编译器不会缓存。length,因此它没有区别,如果你比较0或。length?我想这对于你正在处理的编译器或解释器是非常特定的。

我想说的是,如果你使用的是一个优化的编译器或解释器,那么你不应该担心这个问题,这是语言开发人员应该担心的问题。

其他回答

既然你对这个主题感兴趣,可以看看Greg Reimer关于JavaScript循环基准的博客文章,用JavaScript编写循环的最快方法是什么?:

我为JavaScript中不同的循环编码方式构建了一个循环基准测试套件。现在已经有一些这样的工具了,但是我还没有找到任何一个能够区分原生数组和HTML集合的工具。

您还可以通过打开https://blogs.oracle.com/greimer/resource/loop-test.html对循环进行性能测试(如果JavaScript在浏览器中被NoScript阻塞,则无法工作)。

编辑:

Milan Adamovsky最近创建的基准测试可以在运行时针对不同的浏览器执行。

在Mac OS X 10.6上的Firefox 17.0测试中,我得到了以下循环:

回答这类问题的最好方法就是亲自去尝试。建立一个计算百万次迭代的循环,并以两种方式进行。对两个循环进行计时,并比较结果。

答案可能取决于您使用的浏览器。有些会有不同的结果。

我想为这个线程贡献最快的JavaScript循环,是跨浏览器的!与反向while循环相比,该循环的性能提高了500%以上。

我的博客:JavaScript中最快的循环

递减模式的最快方式:

var iteration = 10000000;
    while(iteration > 0){
        iteration--;
    }

速度比:

var iteration = 10000000;
    while(iteration--);

Javascript微优化测试

我在jsbench上做了一个比较。

正如alestani指出的那样,在升序循环中需要花费时间的一件事是,对于每次迭代,计算数组的大小。在这个循环中:

for ( var i = 1; i <= array.length; i++ )

每次增加i,你就计算。length。

for ( var i = 1, l = array.length; i <= l; i++ )

当你声明i时,你只对.length求值一次。

for ( var i = array.length; i--; )

比较是隐式的,它发生在i递减之前,并且代码非常可读。然而,你在循环中放入的东西会产生很大的不同。

循环调用函数(在其他地方定义):

for (i = values.length; i-- ;) {
  add( values[i] );
}

内联代码循环:

var sum = 0;
for ( i = values.length; i-- ;) {
  sum += values[i];
}

如果你可以内联你的代码,而不是调用一个函数,而不牺牲易读性,你可以有一个数量级的速度循环!


注意:由于浏览器越来越擅长内联简单的函数,这实际上取决于你的代码有多复杂。所以,先配置再优化,因为

瓶颈可能在其他地方(ajax, reflow,…) 你可以选择一个更好的算法 您可以选择更好的数据结构

但是请记住:

代码是为了让人阅读而写的,只是顺便让机器执行。