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

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

即。

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

当前回答

简单地说

“i——和i++。实际上,它们都需要相同的时间。”

但在这种情况下,当你进行增量操作。处理器计算.length每个时间变量都加1,如果减量..特别是在这种情况下,它只计算一次。length直到得到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上的基准测试)。

我在jsbench上做了一个比较。

正如alestani指出的那样,在升序循环中需要花费时间的一件事是,对于每次迭代,计算数组的大小。在这个循环中:

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

每次增加i,你就计算。length。

for ( var i = 1, l = array.length; i <= l; i++ )

当你声明i时,你只对.length求值一次。

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

比较是隐式的,它发生在i递减之前,并且代码非常可读。然而,你在循环中放入的东西会产生很大的不同。

循环调用函数(在其他地方定义):

for (i = values.length; i-- ;) {
  add( values[i] );
}

内联代码循环:

var sum = 0;
for ( i = values.length; i-- ;) {
  sum += values[i];
}

如果你可以内联你的代码,而不是调用一个函数,而不牺牲易读性,你可以有一个数量级的速度循环!


注意:由于浏览器越来越擅长内联简单的函数,这实际上取决于你的代码有多复杂。所以,先配置再优化,因为

瓶颈可能在其他地方(ajax, reflow,…) 你可以选择一个更好的算法 您可以选择更好的数据结构

但是请记住:

代码是为了让人阅读而写的,只是顺便让机器执行。

首先,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——'。

我想为这个线程贡献最快的JavaScript循环,是跨浏览器的!与反向while循环相比,该循环的性能提高了500%以上。

我的博客:JavaScript中最快的循环

++还是——并不重要,因为JavaScript是一种解释型语言,而不是编译型语言。每条指令都翻译成一种以上的机器语言,你不应该关心那些血腥的细节。

那些谈论使用——(或++)来有效使用汇编指令的人是错误的。这些指令适用于整数算术,在JavaScript中没有整数,只有数字。

您应该编写可读的代码。