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

Posted

技术标签:

【中文标题】在 JavaScript 中,为啥“反向 while”循环比“for”快一个数量级?【英文标题】:In JavaScript, why is a "reverse while" loop an order of magnitude faster than "for"?在 JavaScript 中,为什么“反向 while”循环比“for”快一个数量级? 【发布时间】:2012-06-06 14:13:43 【问题描述】:

在这些基准测试中,http://jsperf.com/the-loops,Barbara Cassani 表明“反向 while”循环要快得多,

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,每页只执行一次。因此,减少它意味着我们并没有真正进入循环。对不起。

【问题讨论】:

方式更快有点乐观。我们在这里讨论的是 数百万 次操作。 我希望物理架构成为其中的一部分。减法比加法更快,因为减量会导致所表示数字的物理大小减小。但我没想到这些数字所暗示的那种差异。 很抱歉,但是很啰嗦? (我说的是“递减导致所代表数字的物理大小减小”)。 额外变量会减慢循环速度,是的。 jsperf.com/the-loops/8 【参考方案1】:

除了初测的大bug,结果如下:

forwhile 没有区别 但&gt;&lt;!==

http://jsperf.com/the-loops/15

【讨论】:

【参考方案2】:

这是因为每个 javascript 引擎的内部细节。不要将它用于优化,因为你不能在逻辑上指望它总是随着引擎的变化而变得更快。例如,查看last revision of test you've linked 并注意,如果在最近的浏览器上完全存在差异,那么差异会小得多。

【讨论】:

在所有经过测试的架构中都过于一致(大小不同,但“反向同时”总是以很大的优势获胜)。我宁愿接受@SomeGuy 的观察,即附加变量是罪魁祸首。 这正是“内部细节”的含义。从逻辑上讲,初始化程序不应减慢每次迭代。如果它现在确实如此,那只是因为没有人费心去优化它,因为收益可以忽略不计(只需尝试测量每次迭代损失了多少纳秒)。

以上是关于在 JavaScript 中,为啥“反向 while”循环比“for”快一个数量级?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 + [] 在 Javascript 中返回 0? [复制]

Javascript:为啥不能在回调函数中获取变量?

为啥在带有括号的 Javascript 事件处理函数中?

为啥在javascript中使用“//-->”

为啥 JavaScript 在普通浏览器中没有自己的线程?

JavaScript:为啥我们在函数中使用 **arguments** 对象? [复制]