这话我听过好几次了。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.
}
当前回答
For (var I = array.length;我,)快不了多少。但是当你替换数组时。使用super_puper_function(),这可能会快得多(因为它在每次迭代中都被调用)。这就是区别。
如果你打算在2014年改变它,你不需要考虑优化。如果你打算用“搜索和替换”来改变它,你不需要考虑优化。如果你没有时间,你不需要考虑优化。但是现在,你有时间考虑一下。
注:i——并不比i++快。
其他回答
你现在做的方式不是更快(除了它是一个无限循环,我猜你的意思是做I——。
如果你想让它更快,请:
for (i = 10; i--;) {
//super fast loop
}
当然,在这么小的循环中你不会注意到它。它更快的原因是因为你在检查i是否为“真”时递减i(当它达到0时,它的计算结果为“假”)
我不认为在JavaScript中说I比i++更快是有意义的。
首先,它完全依赖于JavaScript引擎实现。
其次,如果最简单的构造被JIT化并转换为本机指令,那么i++ vs i——将完全依赖于执行它的CPU。也就是说,在arm(移动电话)上,下降到0更快,因为递减和比较0是在一条指令中执行的。
也许,你认为一个比另一个更浪费,因为建议的方式是
for(var i = array.length; i--; )
但建议的方式不是因为一个比另一个快,而只是因为如果你写
for(var i = 0; i < array.length; i++)
然后是每个迭代数组。length必须被计算(更聪明的JavaScript引擎可能会发现循环不会改变数组的长度)。尽管它看起来像一个简单的语句,但它实际上是JavaScript引擎在底层调用的某个函数。
The other reason, why i-- could be considered "faster" is because JavaScript engine needs to allocate only one internal variable to control the loop (variable to the var i). If you compared to array.length or to some other variable then there had to be more than one internal variable to control the loop, and the number of internal variables are limited asset of a JavaScript engine. The less variables are used in a loop the more chance JIT has for optimization. That's why i-- could be considered faster...
这个人比较了javascript和很多浏览器中的循环。他还提供了一个测试套件,您可以自己运行这些测试。
在所有情况下(除非我在阅读中遗漏了一个),最快的循环是:
var i = arr.length; //or 10
while(i--)
{
//...
}
递减模式的最快方式:
var iteration = 10000000;
while(iteration > 0){
iteration--;
}
速度比:
var iteration = 10000000;
while(iteration--);
Javascript微优化测试
这只是一个猜测,但这可能是因为处理器更容易将某个值与0 (i >= 0)进行比较,而不是与另一个值(i < Things.length)进行比较。