2009-01-27 111 views
0

迭代对象属性和迭代数组时迭代性能是否有影响?ActionScript2的性能:迭代对象属性

例,使用对象:

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实现中,迭代对象属性的速度比20x慢,但我一直无法为ActionScript2找到这样的度量。

回答

1

我只是想一个非常类似的试验,但迭代只是一旦超过200K元素,具有相反的结果:

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

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

我怀疑卢克的测试是由循环的开销,这似乎在阵的情况下更大的支配。 另外,请注意,数组花费的时间明显较长,因此如果您的任务插入较重,则使用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"); 
+0

你能发布你的代码吗? – Luke 2009-01-27 23:43:30

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执行。

+0

不确定你为什么要做同样的测试100000次?另外,正如Simon所说的,初始化应该保持在测量之外...... – moritzstefaner 2009-01-27 23:56:09