这话我听过好几次了。JavaScript循环在向后计数时真的更快吗?如果有,为什么?我已经看到了一些测试套件示例,它们显示反向循环更快,但我找不到任何解释!
我假设这是因为循环不再需要在每次检查属性时评估它是否已经完成,它只检查最终的数值。
即。
for (var i = count - 1; i >= 0; i--)
{
// count is only evaluated once and then the comparison is always on 0.
}
这话我听过好几次了。JavaScript循环在向后计数时真的更快吗?如果有,为什么?我已经看到了一些测试套件示例,它们显示反向循环更快,但我找不到任何解释!
我假设这是因为循环不再需要在每次检查属性时评估它是否已经完成,它只检查最终的数值。
即。
for (var i = count - 1; i >= 0; i--)
{
// count is only evaluated once and then the comparison is always on 0.
}
当前回答
我在《Sublime Text 2》中看到了同样的建议。
如前所述,主要的改进不是在for循环的每次迭代中计算数组的长度。这是一种众所周知的优化技术,当数组是HTML文档的一部分时,在JavaScript中特别有效(为所有li元素执行for)。
例如,
For (var I = 0;i < document.getElementsByTagName('li').length;我+ +)
慢得多
for (was i = 0, len = document.getElementsByTagName('li').length; in < fief; i++)
在我看来,你的问题中表单的主要改进是它没有声明一个额外的变量(在我的例子中是len)
但如果你问我,我认为重点不在于i++ vs i——优化,而在于不必在每次迭代时计算数组的长度(您可以看到jsperf上的基准测试)。
其他回答
我想为这个线程贡献最快的JavaScript循环,是跨浏览器的!与反向while循环相比,该循环的性能提高了500%以上。
我的博客:JavaScript中最快的循环
我不认为在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中执行此操作绝对没有区别。
首先,你可以自己测试一下:
Jsperf -对于各种性能来说都是一个很好的平台 用JavaScript进行测试。 http://jsperf.com/inc-vs-dec-2
您不仅可以在任何JavaScript库中测试和运行任何脚本,还可以访问之前编写的所有脚本,以及查看在不同平台上的不同浏览器中执行时间的差异。
所以就你所看到的,在任何环境下,两者的性能没有区别。
如果你想提高脚本的性能,你可以尝试做以下事情:
a = array.length;语句,这样就不会在每次循环中都计算它的值 循环展开http://en.wikipedia.org/wiki/Loop_unwinding
但你必须明白,你所能获得的改善是如此微不足道,大多数情况下你甚至不应该关心它。
我个人认为为什么会出现这样的误解(十二月vs Inc)
很久很久以前,有一个常见的机器指令,DSZ(减量和跳过零)。用汇编语言编程的人使用这条指令来实现循环,以保存寄存器。现在这个古老的事实已经过时了,而且我非常确定使用这个伪改进在任何语言中都不会得到任何性能改进。
我认为这种知识在我们这个时代传播的唯一方式是当你阅读另一个人的代码。看到这样的结构,问为什么要实现它,这里的答案是:“它提高了性能,因为它与零相比”。你对同事的更高知识感到困惑,并认为用它来变得更聪明:-)
并不是说i比i++快。实际上,它们都一样快。
在升序循环中需要花费时间的是,对于每个i,计算数组的大小。在这个循环中:
for(var i = array.length; i--;)
当你声明i时,你只对.length求值一次,而对于这个循环
for(var i = 1; i <= array.length; i++)
当你检查i是否<= array.length时,你每次增加i就计算.length。
在大多数情况下,您甚至不应该担心这种优化。
这个人比较了javascript和很多浏览器中的循环。他还提供了一个测试套件,您可以自己运行这些测试。
在所有情况下(除非我在阅读中遗漏了一个),最快的循环是:
var i = arr.length; //or 10
while(i--)
{
//...
}