Adobeのサイトに公開された「Optimizing Performance for the Flash Platform」の「Vector class versus Array class」の項は、Flash Player 10から実装されたVectorクラスとArrayクラス(配列)との処理速度を比べています。
VectorとArrayクラスの使い方やその違いについては、Adobeデベロッパーセンター「ActionScript 3.0におけるパフォーマンス向上のヒント」の05「ArrayとVectorクラス」で解説しましたので、ご参照ください。本稿では、前記のドキュメントに沿って、ふたつのクラスの処理速度を比べてみます。
まず、条件を揃えなければなりません。配列のエレメントはデータ型を問わず、さまざまな種類の値を混在させられます。また、値を納めるインデックスは連番でなくて構いません。しかし、Vectorクラスと合わせるため、データ型を整数(int)に定め、インデックス0から連番で値を加えることにします。
つぎに、Vectorクラスはオプションとして、インスタンスに対してその長さ(エレメント数)を固定できます。この指定により、さらに処理の最適化が期待できます。そこで、別途テストに加えて、結果を確かめます。
以下のフレームアクションを試すと、長さを固定したVectorインスタンスの処理がもっとも速く、ついで通常のVectorインスタンス、Arrayインスタンスの順に明らかな速度の差が見られるようです。もちろん、具体的な数値は環境によって変わるでしょう。その比較のため、wonderflにテスト用のクラスをアップロードしました。
const MAX_NUMBER:int = 5000000;
var my_array:Array = new Array();
var myVector:Vector.<int> = new Vector.<int>();
var myVectorFixed:Vector.<int> = new Vector.<int>(MAX_NUMBER, true); // 長さを固定
var i:int;
var started:int;
testArray();
testVector();
testVectorFixed();
function testArray():void {
started = getTimer();
for (i = 0; i < MAX_NUMBER; i++) {
my_array[i] = i;
}
trace(getTimer() - started);
}
function testVector():void {
started = getTimer();
for (i = 0; i < MAX_NUMBER; i++) {
myVector[i] = i;
}
trace(getTimer() - started);
}
function testVectorFixed():void {
started = getTimer();
for (i = 0; i < MAX_NUMBER; i++) {
myVectorFixed[i] = i;
}
trace(getTimer() - started);
}
なお、前掲のAdobeのドキュメントでは、インスタンスのエレメントとしてランダムな浮動小数値(Math.random()メソッドの戻り値)を加えています。しかし、Mathクラスのメソッドを用いると、その呼出しそのものの負荷が加わるため、上記フレームアクションでは単純なカウンタ変数をエレメントにしました。