这话我听过好几次了。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循环,是跨浏览器的!与反向while循环相比,该循环的性能提高了500%以上。
我的博客:JavaScript中最快的循环
其他回答
这并不依赖于——或++符号,而是取决于你在循环中应用的条件。
例如:如果变量有一个静态值,那么循环会比每次循环都检查条件(比如数组的长度或其他条件)更快。
但是不用担心这种优化,因为这次它的效果是以纳秒为单位衡量的。
由于其他答案似乎都没有回答你的具体问题(其中一半以上展示了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这样的高级语言中,i++和i——在性能上没有区别。
性能标准是在for循环和compare语句中的使用。
这适用于所有高级语言,并且基本上独立于JavaScript的使用。解释是最后一行的汇编代码。
详细解释
在循环中可能会出现性能差异。背景是,在汇编代码级别上,您可以看到compare with 0只是一个语句,不需要额外的寄存器。
这种比较是在循环的每一次传递中进行的,可能会导致可测量的性能改进。
for(var i = array.length; i--; )
将被求值为如下的伪代码:
i=array.length
:LOOP_START
decrement i
if [ i = 0 ] goto :LOOP_END
... BODY_CODE
:LOOP_END
注意,0是一个字面值,或者换句话说,是一个常量值。
for(var i = 0 ; i < array.length; i++ )
将被计算为如下的伪代码(假设是正常的解释器优化):
end=array.length
i=0
:LOOP_START
if [ i < end ] goto :LOOP_END
increment i
... BODY_CODE
:LOOP_END
注意,end是一个需要CPU寄存器的变量。这可能会在代码中调用额外的寄存器交换,并且需要在if语句中使用更昂贵的compare语句。
只是我的5美分
对于高级语言来说,可读性(有助于可维护性)作为一种较小的性能改进更为重要。
通常,从数组开始到结束的经典迭代更好。
从数组末端到开始的快速迭代会导致可能不需要的反向序列。
附言
正如在评论中问到的:-i和i-的区别在于i在递减之前或之后的求值。
最好的解释是尝试一下;-)下面是一个Bash示例。
% i=10; echo "$((--i)) --> $i"
9 --> 9
% i=10; echo "$((i--)) --> $i"
10 --> 9
我想为这个线程贡献最快的JavaScript循环,是跨浏览器的!与反向while循环相比,该循环的性能提高了500%以上。
我的博客:JavaScript中最快的循环