Лучший способ присоединиться к массивам в Actionscript - PullRequest
1 голос
/ 14 января 2011

Мне нужно добавить один массив в другой (заботиться только о сохранении объединенного).Какой предпочтительный способ сделать это?Скорость - основная проблема, сопровождаемая удобочитаемостью (я рассматриваю Вариант 1, чтобы быть более чистым выбором).Я предполагаю, что это также может зависеть от длины массивов, но есть ли хорошие рекомендации?

Вариант 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);
}

Ответы [ 2 ]

9 голосов
/ 14 января 2011

Звучит как работа для ... эталона!

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

Как я и подозревал, concat работает намного быстрее, особенно при работе с большими массивами.

ВЫХОД

---- 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

Эти числа даны в миллисекундах, как указывает Ричард, если ваши массивы не содержат огромное количество элементов или вы не объединяете массивы очень часто, тогда эта оптимизация не стоит вашего времени

4 голосов
/ 14 января 2011

Я бы использовал concat лично, потому что это проще.

Вероятно, это тоже быстрее (потому что это может быть реализовано изначально), но измерьте его, если это важно для вас. Если вы не имеете дело с чрезвычайно большим количеством значений массива, вряд ли это будет разницей, и это станет ярким примером микрооптимизации.

...