2

根据 Adob​​e 的说法,反向 for 循环是执行循环的最快方法:

http://www.adobe.com/devnet/flash/articles/optimizing-flash-performance.html

我无法创建一个反向 for 循环始终比正常循环快的测试,但我假设 Adob​​e 知道 Flash。有谁知道在什么情况下这是真的,为什么?

4

2 回答 2

4

如果向后迭代,则不必重新计算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);
}
于 2013-08-26T23:31:02.183 回答
2

Marty 是正确的:如果您使用反向 for 循环,您只需获取一次长度值。但是,这可以通过正常的 for 循环轻松实现,并预先将长度分配给变量。

进一步优化的反向 for 循环如下所示:

for(var i:int = list.length; i--;)

这导致在没有第三个 for 循环参数的情况下反向循环遍历数组中的每个元素。

于 2013-08-26T23:54:21.300 回答