这话我听过好几次了。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这一事实无关。
这是因为只有少数Javascript引擎(JIT列表中的那些)真正生成机器语言代码。
大多数Javascript引擎构建源代码的内部表示,然后对其进行解释(要了解这是什么样子,请查看Firefox的SpiderMonkey页面底部附近)。一般来说,如果一段代码实际上做同样的事情,但导致更简单的内部表示,它将运行得更快。
请记住,对于简单的任务,如从一个变量中添加/减去一个,或将一个变量与某个东西进行比较,解释器从一个内部“指令”移动到下一个“指令”的开销是相当高的,因此JS引擎内部使用的“指令”越少越好。
其他回答
它可以解释为JavaScript(以及所有语言)最终被转换为在CPU上运行的操作码。cpu总是只有一条指令用于与0进行比较,这非常快。
顺便说一句,如果你能保证count总是>= 0,你可以简化为:
for (var i = count; i--;)
{
// whatever
}
爱死它了,很多分数但没有回答:D
简单地把比较放在零总是最快的比较
因此(a==0)返回True比(a==5)更快
它很小且无关紧要,并且集合中有1亿行,因此它是可测量的。
例如,在循环中,你可能会说where I <= array。长度和I的增量
在下行循环中,你可能会说I >= 0,而不是减去I。
比较速度更快。而不是循环的“方向”。
回答这类问题的最好方法就是亲自去尝试。建立一个计算百万次迭代的循环,并以两种方式进行。对两个循环进行计时,并比较结果。
答案可能取决于您使用的浏览器。有些会有不同的结果。
简单地说
“i——和i++。实际上,它们都需要相同的时间。”
但在这种情况下,当你进行增量操作。处理器计算.length每个时间变量都加1,如果减量..特别是在这种情况下,它只计算一次。length直到得到0。
首先,i++和i——在任何编程语言(包括JavaScript)上花费的时间完全相同。
下面的代码花费的时间大不相同。
快速:
for (var i = 0, len = Things.length - 1; i <= len; i++) { Things[i] };
慢:
for (var i = 0; i <= Things.length - 1; i++) { Things[i] };
因此,下面的代码也需要不同的时间。
快速:
for (var i = Things.length - 1; i >= 0; i--) { Things[i] };
慢:
for (var i = 0; i <= Things.length - 1; i++) { Things[i] };
附:由于编译器的优化,Slow只适用于少数语言(JavaScript引擎)。最好的方法是用'<'代替'<='(或'='),用'——i'代替'i——'。