这话我听过好几次了。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.
}
当前回答
编译器不会缓存。length,因此它没有区别,如果你比较0或。length?我想这对于你正在处理的编译器或解释器是非常特定的。
我想说的是,如果你使用的是一个优化的编译器或解释器,那么你不应该担心这个问题,这是语言开发人员应该担心的问题。
其他回答
首先,i++和i——在任何编程语言(包括JavaScript)上花费的时间完全相同。
下面的代码花费的时间大不相同。
快速:
for (var i = 0, len = Things.length - 1; i <= len; i++) { Things[i] };
慢:
for (var i = 0; i <= Things.length - 1; i++) { Things[i] };
因此,下面的代码也需要不同的时间。
快速:
for (var i = Things.length - 1; i >= 0; i--) { Things[i] };
慢:
for (var i = 0; i <= Things.length - 1; i++) { Things[i] };
附:由于编译器的优化,Slow只适用于少数语言(JavaScript引擎)。最好的方法是用'<'代替'<='(或'='),用'——i'代替'i——'。
这只是一个猜测,但这可能是因为处理器更容易将某个值与0 (i >= 0)进行比较,而不是与另一个值(i < Things.length)进行比较。
++还是——并不重要,因为JavaScript是一种解释型语言,而不是编译型语言。每条指令都翻译成一种以上的机器语言,你不应该关心那些血腥的细节。
那些谈论使用——(或++)来有效使用汇编指令的人是错误的。这些指令适用于整数算术,在JavaScript中没有整数,只有数字。
您应该编写可读的代码。
简而言之:在JavaScript中执行此操作绝对没有区别。
首先,你可以自己测试一下:
Jsperf -对于各种性能来说都是一个很好的平台 用JavaScript进行测试。 http://jsperf.com/inc-vs-dec-2
您不仅可以在任何JavaScript库中测试和运行任何脚本,还可以访问之前编写的所有脚本,以及查看在不同平台上的不同浏览器中执行时间的差异。
所以就你所看到的,在任何环境下,两者的性能没有区别。
如果你想提高脚本的性能,你可以尝试做以下事情:
a = array.length;语句,这样就不会在每次循环中都计算它的值 循环展开http://en.wikipedia.org/wiki/Loop_unwinding
但你必须明白,你所能获得的改善是如此微不足道,大多数情况下你甚至不应该关心它。
我个人认为为什么会出现这样的误解(十二月vs Inc)
很久很久以前,有一个常见的机器指令,DSZ(减量和跳过零)。用汇编语言编程的人使用这条指令来实现循环,以保存寄存器。现在这个古老的事实已经过时了,而且我非常确定使用这个伪改进在任何语言中都不会得到任何性能改进。
我认为这种知识在我们这个时代传播的唯一方式是当你阅读另一个人的代码。看到这样的结构,问为什么要实现它,这里的答案是:“它提高了性能,因为它与零相比”。你对同事的更高知识感到困惑,并认为用它来变得更聪明:-)
帮助别人避免头痛——投票吧!!
本页上最流行的答案在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;
}