2009-01-27 112 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