[AS3] Vectorクラス対Arrayクラスの処理速度比較 [Edit]

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クラスのメソッドを用いると、その呼出しそのものの負荷が加わるため、上記フレームアクションでは単純なカウンタ変数をエレメントにしました。

コメント

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

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

その他の記事