这话我听过好几次了。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中最快的循环
这并不依赖于——或++符号,而是取决于你在循环中应用的条件。
例如:如果变量有一个静态值,那么循环会比每次循环都检查条件(比如数组的长度或其他条件)更快。
但是不用担心这种优化,因为这次它的效果是以纳秒为单位衡量的。
这个人比较了javascript和很多浏览器中的循环。他还提供了一个测试套件,您可以自己运行这些测试。
在所有情况下(除非我在阅读中遗漏了一个),最快的循环是:
var i = arr.length; //or 10
while(i--)
{
//...
}
它可以解释为JavaScript(以及所有语言)最终被转换为在CPU上运行的操作码。cpu总是只有一条指令用于与0进行比较,这非常快。
顺便说一句,如果你能保证count总是>= 0,你可以简化为:
for (var i = count; i--;)
{
// whatever
}
我最后一次为它烦恼是在编写6502程序集时(8位,是的!)最大的收获是大多数算术操作(特别是减数)更新了一组标志,其中一个是Z,“达到零”指示符。
因此,在循环的最后,您只执行了两条指令:DEC(减量)和JNZ(如果不是零则跳),不需要进行比较!