这话我听过好几次了。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(在c++中)更快,因为只有一个结果,即递减的值。I——需要将减后的值存储回I,并保留原始值作为结果(j = I——;)。在大多数编译器中,这会占用两个而不是一个寄存器,这可能会导致另一个变量必须写入内存,而不是作为寄存器变量保留。
我同意其他人的看法,他们说现在没有什么不同。
递减模式的最快方式:
var iteration = 10000000;
while(iteration > 0){
iteration--;
}
速度比:
var iteration = 10000000;
while(iteration--);
Javascript微优化测试
我想为这个线程贡献最快的JavaScript循环,是跨浏览器的!与反向while循环相比,该循环的性能提高了500%以上。
我的博客:JavaScript中最快的循环
回答这类问题的最好方法就是亲自去尝试。建立一个计算百万次迭代的循环,并以两种方式进行。对两个循环进行计时,并比较结果。
答案可能取决于您使用的浏览器。有些会有不同的结果。
我在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,…) 你可以选择一个更好的算法 您可以选择更好的数据结构
但是请记住:
代码是为了让人阅读而写的,只是顺便让机器执行。