正如我所说:这两个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;
}
我之前测试过它们。结果说第一个更快但我不知道我做得对。
答案 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的例子更好。