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

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

即。

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

当前回答

这个人比较了javascript和很多浏览器中的循环。他还提供了一个测试套件,您可以自己运行这些测试。

在所有情况下(除非我在阅读中遗漏了一个),最快的循环是:

var i = arr.length; //or 10
while(i--)
{
  //...
}

其他回答

它取决于数组在内存中的位置,以及访问该数组时内存页面的命中率。

在某些情况下,按列顺序访问数组成员比按行顺序访问快,因为命中率增加了。

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

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

你现在做的方式不是更快(除了它是一个无限循环,我猜你的意思是做I——。

如果你想让它更快,请:

for (i = 10; i--;) {
    //super fast loop
}

当然,在这么小的循环中你不会注意到它。它更快的原因是因为你在检查i是否为“真”时递减i(当它达到0时,它的计算结果为“假”)

不是——或++,而是比较操作。使用——,你可以使用与0比较,而使用++,你需要与长度比较。在处理器上,与零的比较通常是可用的,而与有限整数的比较则需要减法。

a++ < length

实际编译为

a++
test (a-length)

所以它在编译时在处理器上花费的时间更长。

并不是说i比i++快。实际上,它们都一样快。

在升序循环中需要花费时间的是,对于每个i,计算数组的大小。在这个循环中:

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

当你声明i时,你只对.length求值一次,而对于这个循环

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

当你检查i是否<= array.length时,你每次增加i就计算.length。

在大多数情况下,您甚至不应该担心这种优化。