2011-01-13 11 views
1

Ich muss ein Array zu einem anderen hinzufügen (nur daran interessiert, den verbundenen zu speichern). Welches ist der bevorzugte Weg, dies zu tun? Geschwindigkeit ist die Hauptsorge, gefolgt von Lesbarkeit (Ich halte Option 1 für eine sauberere Option). Ich nehme an, es könnte auch von der Länge der Arrays abhängen, aber gibt es irgendwelche guten Richtlinien?Die beste Möglichkeit, Arrays in Actionscript zu verbinden

Option 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); 

Option 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); 
} 

Antwort

9

Das klingt nach einem Job für ... Benchmark!

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(); 

Wie ich vermutet hätte, ist concat viel schneller, besonders im Umgang mit größeren Arrays.

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 

Diese Zahlen in Millisekunden sind, so wie Richard weist darauf hin, es sei denn, Ihre Arrays eine große Anzahl von Elementen haben, oder Sie sind Arrays sehr häufig verketten, dann ist dies eine Optimierung, die ist nicht wert Ihre Zeit

+0

Danke, dass Sie sich die Zeit nehmen, dies zusammen zu setzen! Ich weiß, dass die Mikrooptimierung sinnlos ist, aber ich werde immer noch belästigt, wenn ich die Antwort auf eine Frage wie diese nicht kenne, haha. – Ocelot20

4

ich concat persönlich verwenden würde, weil es einfacher ist.

Es ist wahrscheinlich auch schneller (weil es nativ implementiert werden kann), aber messen Sie es, wenn es Ihnen wichtig ist. Wenn Sie nicht mit einer extrem großen Anzahl von Array-Werten zu tun haben, ist es unwahrscheinlich, dass es einen Unterschied gibt und wäre ein Paradebeispiel für Mikro-Optimierung.

Verwandte Themen