这话我听过好几次了。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.
}
当前回答
不是——或++,而是比较操作。使用——,你可以使用与0比较,而使用++,你需要与长度比较。在处理器上,与零的比较通常是可用的,而与有限整数的比较则需要减法。
a++ < length
实际编译为
a++
test (a-length)
所以它在编译时在处理器上花费的时间更长。
其他回答
简单地说
“i——和i++。实际上,它们都需要相同的时间。”
但在这种情况下,当你进行增量操作。处理器计算.length每个时间变量都加1,如果减量..特别是在这种情况下,它只计算一次。length直到得到0。
递减模式的最快方式:
var iteration = 10000000;
while(iteration > 0){
iteration--;
}
速度比:
var iteration = 10000000;
while(iteration--);
Javascript微优化测试
For (var I = array.length;我,)快不了多少。但是当你替换数组时。使用super_puper_function(),这可能会快得多(因为它在每次迭代中都被调用)。这就是区别。
如果你打算在2014年改变它,你不需要考虑优化。如果你打算用“搜索和替换”来改变它,你不需要考虑优化。如果你没有时间,你不需要考虑优化。但是现在,你有时间考虑一下。
注:i——并不比i++快。
我在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,…) 你可以选择一个更好的算法 您可以选择更好的数据结构
但是请记住:
代码是为了让人阅读而写的,只是顺便让机器执行。
回答这类问题的最好方法就是亲自去尝试。建立一个计算百万次迭代的循环,并以两种方式进行。对两个循环进行计时,并比较结果。
答案可能取决于您使用的浏览器。有些会有不同的结果。