ActionScript2性能:迭代对象属性

时间:2009-01-27 10:48:50

标签: performance actionscript actionscript-2 iteration

在迭代对象属性与迭代数组时是否会影响性能?

示例,使用对象:

var x:Object = {one: 1, two: 2, three: 3};
for (var s:String in x) {
 trace(x[s]);
}

使用数组的

var a:Array = [1, 2, 3];
var len:Number = a.length;
for (var i:Number = 0; i < len; ++i) {
 trace(a[i]);
}

那么 - 哪个更快,最重要的是什么因素?

IIRC,在一些JavaScript实现中,迭代对象属性的速度要慢20倍,但我无法为ActionScript2找到这样的测量。

2 个答案:

答案 0 :(得分:1)

我刚刚尝试了一个非常相似的测试,但只迭代了200k个元素,结果相反:

Task build-arr: 2221ms
Task iter-arr: 516ms

Task build-obj: 1410ms
Task iter-obj: 953ms

我怀疑Luke的测试是由循环开销控制的,在数组的情况下似乎更大。 另外,请注意,数组首先填充的时间要长得多,所以如果你的任务是插入重的话,那么ymmv。

另外,在我的测试中,将arr.length存储在局部变量中会使性能提高约15%。

<强> 更新

根据大众需求,我发布了我使用过的代码。

var iter:Number = 200000;
var time:Number = 0;
var obj:Object = {};
var arr:Array = [];

time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
  arr[i] = i;
}
trace("Task build-arr: " + (getTimer() - time) + "ms");

time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
  arr[i] = arr[i];
}
trace("Task iter-arr: " + (getTimer() - time) + "ms");

time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
  obj[String(i)] = i;
}
trace("Task build-obj: " + (getTimer() - time) + "ms");

time = getTimer();
for (var i:String in obj) {
  obj[i] = obj[i];
}
trace("Task iter-obj: " + (getTimer() - time) + "ms");

答案 1 :(得分:0)

行。为什么不做一些简单的测量?

var time : Number;

time = getTimer();

var x:Object = {one: 1, two: 2, three: 3};

for( i = 0; i < 100000; i++ )
{
    for (var s:String in x) 
    {
        // lets not trace but do a simple assignment instead. 
        x[s] = x[s];
    }
}

trace( getTimer() - time + "ms");

time = getTimer();

var a:Array = [1, 2, 3];
var len:Number = a.length;

for( i = 0; i < 100000; i++ )
{
    for ( var j : Number = 0; j < len; j++) 
    {
        a[j] = a[j];
    }
}

trace( getTimer() - time + "ms");

在我的机器上,数组迭代有点慢。这可能是因为ActionScript 2没有“真正的”数组,只有关联数组(地图)。显然,要使用数组,编译器必须生成一些代码开销。我没有研究过这方面的具体细节,但我可以想象可能就是这种情况。

顺便说一句。执行此测试还可能表明将数组长度值放入变量并不会真正提高性能。放手吧......

更新:尽管ActionScript和JavaScript在语法上是相关的,但底层执行机制却完全不同。例如。 FireFox使用SpiderMonkey,IE可能会使用Microsoft实现,而AS2则由Adobe的AVM1执行。