这话我听过好几次了。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.
}
当前回答
首先,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——'。
其他回答
编译器不会缓存。length,因此它没有区别,如果你比较0或。length?我想这对于你正在处理的编译器或解释器是非常特定的。
我想说的是,如果你使用的是一个优化的编译器或解释器,那么你不应该担心这个问题,这是语言开发人员应该担心的问题。
回答这类问题的最好方法就是亲自去尝试。建立一个计算百万次迭代的循环,并以两种方式进行。对两个循环进行计时,并比较结果。
答案可能取决于您使用的浏览器。有些会有不同的结果。
由于其他答案似乎都没有回答你的具体问题(其中一半以上展示了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
我希望这能回答你的问题。
++还是——并不重要,因为JavaScript是一种解释型语言,而不是编译型语言。每条指令都翻译成一种以上的机器语言,你不应该关心那些血腥的细节。
那些谈论使用——(或++)来有效使用汇编指令的人是错误的。这些指令适用于整数算术,在JavaScript中没有整数,只有数字。
您应该编写可读的代码。
I和i++一样快
下面的代码和你的一样快,但使用了一个额外的变量:
var up = Things.length;
for (var i = 0; i < up; i++) {
Things[i]
};
建议不要每次都计算数组的大小。对于大数组,可以看到性能下降。