在JavaScript中,为什么“反向while”循环比“for”循环快一个数量级?

4
在这些基准测试中,Barbara Cassani表明,“反向while”循环速度更快。您可以查看http://jsperf.com/the-loops了解更多信息。
while (iterations > 0) {
    a = a + 1;
    a = a - 1;
    iterations--;
}

比起通常的“for”循环,它更加高效。
for (i = 0; i < iterations; i++) {
    a = a + 1;
    a = a - 1;
}

为什么?

更新

好了,别管它了,测试中存在一个bug,iterations = 100只在每个页面执行一次。因此减少它,实际上意味着我们并没有真正进入循环。抱歉。


“Way” 更快有点过于乐观了。我们在谈论数百万次操作。 - Matt
我希望物理架构是其中的一部分。减法比加法快,仅仅因为递减会导致所表示数字的物理大小减小。但我不会期望那些数字所暗示的差异。 - Joel Etherton
1
抱歉,但是什么意思?(我指的是“递减会导致所表示数字的物理大小减小”)。 - Oleg V. Volkov
2
多余的变量会减慢循环速度,没错。http://jsperf.com/the-loops/8 - Leonid
2个回答

2

1

这是因为每个JavaScript引擎内部的具体情况不同。不要将其用于优化,因为您不能逻辑上指望它始终比引擎更快。例如,请查看您链接的最后一次测试修订版,请注意,如果存在差异,则在最近的浏览器上差异要小得多。


在所有测试的架构中它表现过于一致(不同幅度,但“反向 while”始终以很大的优势获胜)。我更倾向于采纳@SomeGuy的观察结果,即额外变量是罪魁祸首。 - lanzz
这正是“内部细节”的具体体现。逻辑上,初始化程序不应该减缓每次迭代。如果它现在确实有影响,那只是因为没有人费心去优化它,因为收益微不足道(试着测量一下每次迭代失去了多少纳秒)。 - Oleg V. Volkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接