这两个for循环之间的性能有什么不同吗?

时间:2015-07-03 10:08:17

标签: actionscript-3 flash

正如我所说:这两个for循环之间是否存在差异(性能)? 在此之间:

    var n:int = displayObjects_.length;
    for (var i:int = 0; i < n; i++)
    {
        var currentObject:DisplayObject = displayObjects_[i];
        currentObject.width = newWidth;
    }

和此:

    var n:int = displayObjects_.length;
    for (var i:int = 0; i < n; i++)
    {
        displayObjects_[i].width = newWidth;
    }

我之前测试过它们。结果说第一个更快但我不知道我做得对。

3 个答案:

答案 0 :(得分:1)

我知道这不是你问题的答案,但如果你正在寻找迭代这个数组的最快方法,你应该这样做:

for each(var currentObject:DisplayObject in displayObjects_) {
    currentObject.width = newWidth;
}

答案 1 :(得分:1)

我使用SDK 4.6在一个简单的项目上尝试了这个。这是代码。

public class Main extends Sprite 
{

    public function Main() 
    {
        var displayObjects_:Array = [];
        for (var i:int = 0; i < 1000000; i++)
        {
            displayObjects_.push(new Sprite());
        }

        var start:int = getTimer();
        for (i = 0; i < displayObjects_.length; i++)
        {
            var currentObject:Sprite = displayObjects_[i];
            currentObject.width = 100;
        }
        var end:int = getTimer()
        trace(end, start, end - start);

        start = getTimer();
        for (i = 0; i < displayObjects_.length; i++)
        {
            displayObjects_[i].width = 100;
        }
        end = getTimer()
        trace(end, start, end - start);
    }
}

这些是结果。

  

完成(0)
  [使用FDB启动调试会话]
  16703 16250 453
  17141 16703 438

就像我说的那样,看到两者之间存在任何差异会非常令人惊讶。通过使用Vector而不是Array,您可能会看到更多改进。否则,这个东西太平凡了,不能大惊小怪。

答案 2 :(得分:0)

据我所知,Actionscript编译器会自动将变量定义移动到函数的开头。因此,这个循环每次都不会声明变量,首先采样相同:

  var currentObject:DisplayObject;
  var n:int = displayObjects_.length;
    for (var i:int = 0; i < n; i++)
    {
        currentObject = displayObjects_[i];
        currentObject.width = newWidth;
    }

所以,我认为仅在一个额外的变量声明中存在差异,并且它不会影响性能。但是3vilguy的例子更好。