在他的书中更快的网站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
loop.
我想知道,这是什么原因呢?为什么迭代器递减速度这么快?(我对此的技术背景感兴趣,而不是证明这一说法的基准。)
编辑:乍一看,这里使用的循环语法看起来是错误的。没有length-1
or i>=0
,所以让我们澄清一下(我也很困惑)。
以下是一般的 for 循环语法:
for ([initial-expression]; [condition]; [final-expression])
statement
for 循环语法不是问题的一部分,但因为它有点不常见,我认为澄清它很有趣。也许它更快的原因之一是,因为它使用更少的表达式(0 == false
“诡计”)。
我不确定 Javascript,在现代编译器下这可能并不重要,但在“过去”这段代码:
for (i = 0; i < n; i++){
.. body..
}
会产生
move register, 0
L1:
compare register, n
jump-if-greater-or-equal L2
-- body ..
increment register
jump L1
L2:
而向后计数代码
for (i = n; --i>=0;){
.. body ..
}
会产生
move register, n
L1:
decrement-and-jump-if-negative register, L2
.. body ..
jump L1
L2:
所以在循环内部它只执行两个额外的指令而不是四个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)