在 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,结果如下:
for
与 while
没有区别
但>
或<
比!==
好
http://jsperf.com/the-loops/15
【讨论】:
【参考方案2】:这是因为每个 javascript 引擎的内部细节。不要将它用于优化,因为你不能在逻辑上指望它总是随着引擎的变化而变得更快。例如,查看last revision of test you've linked 并注意,如果在最近的浏览器上完全存在差异,那么差异会小得多。
【讨论】:
在所有经过测试的架构中都过于一致(大小不同,但“反向同时”总是以很大的优势获胜)。我宁愿接受@SomeGuy 的观察,即附加变量是罪魁祸首。 这正是“内部细节”的含义。从逻辑上讲,初始化程序不应减慢每次迭代。如果它现在确实如此,那只是因为没有人费心去优化它,因为收益可以忽略不计(只需尝试测量每次迭代损失了多少纳秒)。以上是关于在 JavaScript 中,为啥“反向 while”循环比“for”快一个数量级?的主要内容,如果未能解决你的问题,请参考以下文章