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

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

即。

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

当前回答

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

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

其他回答

由于其他答案似乎都没有回答你的具体问题(其中一半以上展示了C示例并讨论了较低级的语言,你的问题是针对JavaScript的),我决定自己编写一个。

所以,你看:

简单的答案:i——通常更快,因为它不需要每次运行都与0进行比较,各种方法的测试结果如下所示:

测试结果:正如这个jsPerf“证明”的那样,arr.pop()实际上是迄今为止最快的循环。但是,关注——i, i——,i++和++i,正如你在你的问题中所问的,这里是jsPerf(它们来自多个jsPerf,请参阅下面的来源)的结果总结:

——i和i——在Firefox中是相同的,而i——在Chrome中更快。

在Chrome中,一个基本的for循环(for (var i = 0;I < arrr .length;i++))比i-和-i快,而在Firefox中它较慢。

在Chrome和Firefox中都有缓存的arr。长度明显更快,Chrome领先约17万ops/sec。

在没有显著差异的情况下,++i在大多数浏览器中都比i++快,AFAIK,在任何浏览器中都不会相反。

简短的总结:arr.pop()是目前为止最快的循环;对于特别提到的循环,i——是最快的循环。

资料来源:http://jsperf.com/fastest-array-loops-in-javascript/15, http://jsperf.com/ipp-vs-ppi-2

我希望这能回答你的问题。

这并不依赖于——或++符号,而是取决于你在循环中应用的条件。

例如:如果变量有一个静态值,那么循环会比每次循环都检查条件(比如数组的长度或其他条件)更快。

但是不用担心这种优化,因为这次它的效果是以纳秒为单位衡量的。

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

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

我不认为在JavaScript中说I比i++更快是有意义的。

首先,它完全依赖于JavaScript引擎实现。

其次,如果最简单的构造被JIT化并转换为本机指令,那么i++ vs i——将完全依赖于执行它的CPU。也就是说,在arm(移动电话)上,下降到0更快,因为递减和比较0是在一条指令中执行的。

也许,你认为一个比另一个更浪费,因为建议的方式是

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

但建议的方式不是因为一个比另一个快,而只是因为如果你写

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

然后是每个迭代数组。length必须被计算(更聪明的JavaScript引擎可能会发现循环不会改变数组的长度)。尽管它看起来像一个简单的语句,但它实际上是JavaScript引擎在底层调用的某个函数。

The other reason, why i-- could be considered "faster" is because JavaScript engine needs to allocate only one internal variable to control the loop (variable to the var i). If you compared to array.length or to some other variable then there had to be more than one internal variable to control the loop, and the number of internal variables are limited asset of a JavaScript engine. The less variables are used in a loop the more chance JIT has for optimization. That's why i-- could be considered faster...

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

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

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