这话我听过好几次了。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.
}
当前回答
既然你对这个主题感兴趣,可以看看Greg Reimer关于JavaScript循环基准的博客文章,用JavaScript编写循环的最快方法是什么?:
我为JavaScript中不同的循环编码方式构建了一个循环基准测试套件。现在已经有一些这样的工具了,但是我还没有找到任何一个能够区分原生数组和HTML集合的工具。
您还可以通过打开https://blogs.oracle.com/greimer/resource/loop-test.html对循环进行性能测试(如果JavaScript在浏览器中被NoScript阻塞,则无法工作)。
编辑:
Milan Adamovsky最近创建的基准测试可以在运行时针对不同的浏览器执行。
在Mac OS X 10.6上的Firefox 17.0测试中,我得到了以下循环:
其他回答
爱死它了,很多分数但没有回答:D
简单地把比较放在零总是最快的比较
因此(a==0)返回True比(a==5)更快
它很小且无关紧要,并且集合中有1亿行,因此它是可测量的。
例如,在循环中,你可能会说where I <= array。长度和I的增量
在下行循环中,你可能会说I >= 0,而不是减去I。
比较速度更快。而不是循环的“方向”。
使用前缀增量操作符要快一些。对于后缀,编译器必须保留之前的值作为表达式的结果。
for (var i = 0; i < n; ++i) {
do_stuff();
}
聪明的解释器或编译器会看到i++的结果没有被使用,也不会存储表达式的结果,但不是所有的js引擎都这样做。
我想为这个线程贡献最快的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
我希望这能回答你的问题。
我最后一次为它烦恼是在编写6502程序集时(8位,是的!)最大的收获是大多数算术操作(特别是减数)更新了一组标志,其中一个是Z,“达到零”指示符。
因此,在循环的最后,您只执行了两条指令:DEC(减量)和JNZ(如果不是零则跳),不需要进行比较!