这话我听过好几次了。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.
}
当前回答
简而言之:在JavaScript中执行此操作绝对没有区别。
首先,你可以自己测试一下:
Jsperf -对于各种性能来说都是一个很好的平台 用JavaScript进行测试。 http://jsperf.com/inc-vs-dec-2
您不仅可以在任何JavaScript库中测试和运行任何脚本,还可以访问之前编写的所有脚本,以及查看在不同平台上的不同浏览器中执行时间的差异。
所以就你所看到的,在任何环境下,两者的性能没有区别。
如果你想提高脚本的性能,你可以尝试做以下事情:
a = array.length;语句,这样就不会在每次循环中都计算它的值 循环展开http://en.wikipedia.org/wiki/Loop_unwinding
但你必须明白,你所能获得的改善是如此微不足道,大多数情况下你甚至不应该关心它。
我个人认为为什么会出现这样的误解(十二月vs Inc)
很久很久以前,有一个常见的机器指令,DSZ(减量和跳过零)。用汇编语言编程的人使用这条指令来实现循环,以保存寄存器。现在这个古老的事实已经过时了,而且我非常确定使用这个伪改进在任何语言中都不会得到任何性能改进。
我认为这种知识在我们这个时代传播的唯一方式是当你阅读另一个人的代码。看到这样的结构,问为什么要实现它,这里的答案是:“它提高了性能,因为它与零相比”。你对同事的更高知识感到困惑,并认为用它来变得更聪明:-)
其他回答
我想为这个线程贡献最快的JavaScript循环,是跨浏览器的!与反向while循环相比,该循环的性能提高了500%以上。
我的博客:JavaScript中最快的循环
这只是一个猜测,但这可能是因为处理器更容易将某个值与0 (i >= 0)进行比较,而不是与另一个值(i < Things.length)进行比较。
i——或i++占用的时间并不多。如果你深入到CPU架构中,++比——更快,因为——操作会做2的补位,但它发生在硬件内部,所以这将使它更快,而且++和——之间没有太大的区别,而且这些操作被认为是CPU消耗的时间最少的。
for循环是这样运行的:
在开始时初始化变量一次。 检查循环的第二个操作数中的约束,<,>,<=等。 然后应用循环。 递增循环,循环再次抛出这些进程。
所以,
for (var i = Things.length - 1; i >= 0; i--) {
Things[i]
};
将计算数组的长度只有一次在开始时,这不是很多时间,但是
for(var i = array.length; i--; )
将计算每个循环的长度,因此它将消耗大量时间。
帮助别人避免头痛——投票吧!!
本页上最流行的答案在Firefox 14上不工作,并且没有通过jsLinter。while循环需要比较操作符,而不是赋值操作符。它可以在chrome、safari甚至ie浏览器上运行。但在firefox中消亡了。
这个坏了!
var i = arr.length; //or 10
while(i--)
{
//...
}
这会有用的!(在firefox上工作,通过jsLinter)
var i = arr.length; //or 10
while(i>-1)
{
//...
i = i - 1;
}
在许多情况下,这本质上与处理器比其他比较更快地比较0这一事实无关。
这是因为只有少数Javascript引擎(JIT列表中的那些)真正生成机器语言代码。
大多数Javascript引擎构建源代码的内部表示,然后对其进行解释(要了解这是什么样子,请查看Firefox的SpiderMonkey页面底部附近)。一般来说,如果一段代码实际上做同样的事情,但导致更简单的内部表示,它将运行得更快。
请记住,对于简单的任务,如从一个变量中添加/减去一个,或将一个变量与某个东西进行比较,解释器从一个内部“指令”移动到下一个“指令”的开销是相当高的,因此JS引擎内部使用的“指令”越少越好。