根据 Adobe 的说法,反向 for 循环是执行循环的最快方法:
http://www.adobe.com/devnet/flash/articles/optimizing-flash-performance.html
我无法创建一个反向 for 循环始终比正常循环快的测试,但我假设 Adobe 知道 Flash。有谁知道在什么情况下这是真的,为什么?
根据 Adobe 的说法,反向 for 循环是执行循环的最快方法:
http://www.adobe.com/devnet/flash/articles/optimizing-flash-performance.html
我无法创建一个反向 for 循环始终比正常循环快的测试,但我假设 Adobe 知道 Flash。有谁知道在什么情况下这是真的,为什么?
如果向后迭代,则不必重新计算length
数组或向量的 。
for(var i:int = list.length; i > 0; i--)
// -------------^^^^^^^^^^^ Length is calculated once for the start value.
相对:
for(var i:int = 0; i < list.length; i++)
// --------------------^^^^^^^^^^^ Length is calculated for each iteration.
仅供参考,区别在于速度可以忽略不计。我个人使用对我来说更具可读性的那个(前者)。
除此之外 - 如果您正在迭代所有对象都属于同一类型的集合,则应该使用for each
循环。这比上述任何一个都更快、更易读、更合乎逻辑。它更快的原因是因为每次迭代都不需要类型转换 - 在定义循环时设置类型:
var strings:Array = ["a","b","c"];
for each(var i:String in strings)
{
trace(i);
}
Marty 是正确的:如果您使用反向 for 循环,您只需获取一次长度值。但是,这可以通过正常的 for 循环轻松实现,并预先将长度分配给变量。
进一步优化的反向 for 循环如下所示:
for(var i:int = list.length; i--;)
这导致在没有第三个 for 循环参数的情况下反向循环遍历数组中的每个元素。