2011-01-13 5 views
1

配列を別の配列に追加する必要があります(結合した配列の保存にのみ注意してください)。これを行うための好ましい方法はどれですか?スピードが読みやすさの主な懸念事項です(私はオプション1をよりクリーンなオプションと考えています)。私はそれも配列の長さに依存するかもしれないと仮定しますが、良い指針はありますか?Actionscriptで配列を結合する最善の方法

オプション1:

var array1:Array = new Array("1","2","3"); 
var array2:Array = new Array("4","5","6"); 

// Don't care about array2 after this point. 
var array1 = array1.concat(array2); 

はオプション2:

var array1:Array = new Array("1","2","3"); 
var array2:Array = new Array("4","5","6"); 

// Don't care about array2 after this loop has run. 
for each(var item:Object in array2) 
{ 
    array1.push(item); 
} 

答えて

9

これは...ベンチマークの仕事のように聞こえる!

import flash.utils.getTimer; 

function addItems($array:Array, $start:int, $count:int) { 
    for (var i:Number = $start; i < $start + $count; i++) { 
     $array.push(i); 
    } 
} 

function concatArrays($array1:Array, $array2:Array):Number { 
    var t1:Number = getTimer(); 
    $array1.concat($array2); 
    var t2:Number = getTimer(); 
    return t2 - t1; 
} 

function pushArrays($array1:Array, $array2:Array):Number { 
    var t1:Number = getTimer(); 
    for each (var item:Object in $array2) { 
     $array1.push(item); 
    } 
    var t2:Number = getTimer(); 
    return t2 - t1; 
} 

function testBed() { 
    for (var i:Number = 10000; i <= 100000; i+=10000) { 
     trace("\n---- New test"); 
     var a1:Array = []; 
     var a2:Array = []; 
     addItems(a1, 0, i); 
     addItems(a2, i, i); 
     trace("For " + a1.length + " items: "); 
     trace("concatArrays: " + concatArrays(a1, a2)); 
     trace("pushArrays: " + pushArrays(a1, a2)); 
    } 
} 

testBed(); 

私が疑ったように、特に大きな配列を扱う場合は、連結がはるかに高速です。

OUTPUT

---- New test 
For 10000 items: 
concatArrays: 1 
pushArrays: 1 

---- New test 
For 20000 items: 
concatArrays: 1 
pushArrays: 4 

---- New test 
For 30000 items: 
concatArrays: 1 
pushArrays: 4 

---- New test 
For 40000 items: 
concatArrays: 2 
pushArrays: 5 

---- New test 
For 50000 items: 
concatArrays: 1 
pushArrays: 6 

---- New test 
For 60000 items: 
concatArrays: 1 
pushArrays: 7 

---- New test 
For 70000 items: 
concatArrays: 1 
pushArrays: 8 

---- New test 
For 80000 items: 
concatArrays: 2 
pushArrays: 12 

---- New test 
For 90000 items: 
concatArrays: 2 
pushArrays: 13 

---- New test 
For 100000 items: 
concatArrays: 3 
pushArrays: 14 

リチャードが指摘するように、あなたの配列は要素の膨大な数を持っているか、あなたは非常に頻繁に配列を連結している、これはその最適化されない限り、これらの数字は、ミリ秒単位でありますあなたの価値がない時間

+0

これをまとめる時間をとってくれてありがとう!私はマイクロ最適化が無意味だと知っていますが、私はこのような質問への答えを知らないとまだ悩んでいます。 – Ocelot20

4

それは簡単ですので、私は、個人的にconcatを使用します。

(これはネイティブに実装できるため)おそらく高速ですが、重要な場合はそれを測定します。非常に多くの配列値を扱っていない限り、違いはありそうもなく、マイクロ最適化の主要な例になります。

関連する問題