Steve Sounders在他的《甚至更快的网站》一书中写道,提高循环性能的一种简单方法是将迭代器递减到 0,而不是朝着总长度递增(实际上这一章是由 Nicholas C. Zakas 编写的)。根据每次迭代的复杂性,此更改最多可将原始执行时间节省 50%。例如:
var values = [1,2,3,4,5];
var length = values.length;
for (var i=length; i--;) {
process(values[i]);
}
这对于for
循环、do-while
循环和while
循环几乎是相同的。
我想知道,这是什么原因?为什么要以更快的速度递减迭代器?(我对此的技术背景感兴趣,而不是对证明此声明的基准感兴趣。)
编辑:乍一看,这里使用的循环语法看起来是错误的。没有length-1
or i>=0
,所以让我们澄清一下(我也很困惑)。
这是一般的 for 循环语法:
for ([initial-expression]; [condition]; [final-expression])
statement
初始表达式-
var i=length
首先评估此变量声明。
条件——
i--
该表达式在每次循环迭代之前计算。它将在第一次通过循环之前递减变量。如果此表达式的计算结果为
false
循环结束。在 JavaScript 中0 == false
,如果i
finally 等于0
它被解释为false
循环结束。最终表达式
该表达式在每次循环迭代结束时进行计算(在下一次计算condition 之前)。这里不需要它,它是空的。所有三个表达式在 for 循环中都是可选的。
for 循环语法不是问题的一部分,但因为它有点不常见,我认为澄清它很有趣。也许它更快的一个原因是,因为它使用的表达式更少(0 == false
“技巧”)。