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

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

即。

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

当前回答

在许多情况下,这本质上与处理器比其他比较更快地比较0这一事实无关。

这是因为只有少数Javascript引擎(JIT列表中的那些)真正生成机器语言代码。

大多数Javascript引擎构建源代码的内部表示,然后对其进行解释(要了解这是什么样子,请查看Firefox的SpiderMonkey页面底部附近)。一般来说,如果一段代码实际上做同样的事情,但导致更简单的内部表示,它将运行得更快。

请记住,对于简单的任务,如从一个变量中添加/减去一个,或将一个变量与某个东西进行比较,解释器从一个内部“指令”移动到下一个“指令”的开销是相当高的,因此JS引擎内部使用的“指令”越少越好。

其他回答

它可以解释为JavaScript(以及所有语言)最终被转换为在CPU上运行的操作码。cpu总是只有一条指令用于与0进行比较,这非常快。

顺便说一句,如果你能保证count总是>= 0,你可以简化为:

for (var i = count; i--;)
{
  // whatever
}

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

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

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

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

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

既然你对这个主题感兴趣,可以看看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测试中,我得到了以下循环:

由于其他答案似乎都没有回答你的具体问题(其中一半以上展示了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

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