[AS3] ふたつの配列を連結する [Edit]

ふたつの配列を連結するには、Array.concat()メソッドを用います。ところが、Grant Skinner氏がtwitterで面白い手法を紹介していました。JavaScriptについて書かれたものの、ActionScript 3.0でも使えます。

それはひとつの配列(arr1)に対してFunction.apply()メソッドによりArray.push()メソッドを適用し、もうひとつの配列(arr2)は第2引数として渡してしまうというものです。すると、初めの配列に対してArray.push()メソッドが呼出され、ふたつ目の配列エレメントがその引数に渡されます。したがって、ふたつの配列が連結されるのです。

arr1.push.apply(arr1, arr2);

Skinner氏はこの手法の利点を、Array.concat()メソッドと異なり、新たな配列がつくられないことだと述べています。つまり、Array.concat()メソッドは連結された新たな配列を戻すのに対して、Array.push()メソッドなら参照した配列に直接エレメントを加えるので、その負荷が避けられるということです。

早速、ふたつのやり方で処理の速さがどう変わるか試してみました。まず、エレメント数300の配列ふたつの連結を10,000回繰返してみました(スクリプト001)。すると、結果にばらつきがあり、明らかな違いを認めることはできませんでした。

スクリプト001■300エレメントの配列ふたつを連結

Comparison Array.concat() with the trick using Function.apply() and Array.push() - wonderfl build flash online

そこで、ふたつの配列のエレメント数を大きく違えてみることにしました(繰返し回数は1,000回に調整)。まず、連結される配列のエレメント数を10,000にし、それにエレメント数100の配列を連結します(スクリプト002)。すると、Function.apply()Array.push()メソッドを適用する方が明らかに速くなりました。ところが、このエレメント数を逆転すると、Array.concat()メソッドの方が速くなります(スクリプト003)。

スクリプト002■10,000エレメントの配列に100エレメントの配列を連結

forked from: Comparison Array.concat() with the trick using Function.apply() and Array.push() - wonderfl build flash online


スクリプト002■100エレメントの配列に10,000エレメントの配列を連結

forked from: Comparison Array.concat() with the trick using Function.apply() and Array.push() - wonderfl build flash online

この結果から推測されるのは、Function.apply()メソッドによるArrayインスタンスの参照は速いものの、メソッドArray.push()がエレメントを追加するのはArray.concat()の連結の処理より遅いということでしょう。

[追記2011/01/13] 同じ内容を英文記事にしたJActionScripters「Merging two arrays」に、Skinner氏からのコメントが寄せられました。Array.push()メソッドでエレメントを加える処理量と、配列が新規につくられる負荷のどちらが大きいかによって違いが生じるということでした。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事