0

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

示例,使用对象:

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

VS 使用数组

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 找到这样的测量值。

4

2 回答 2

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");
于 2009-01-27T22:32:17.393 回答
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 由 Adob​​e 的 AVM1 执行。

于 2009-01-27T21:11:06.887 回答