アクセスの速い配列を使う

(サンプル一覧を表示する)

アクセスの速い配列を使うテストをしてみました。

Flash Player 10 以降の環境では、Vector という新しい配列クラスを使うことができます。
これは、従来の Array クラスに比べてアクセスが速いので、
データ処理の多いアプリは、できるだけ Vector に置き換えた方が良いと思います。

Flash Player 9 以前の環境では Vector は使えませんので注意してください。
Flash の実行画面
アクセスの速い配列を使う

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

アクセスの速い配列を使う

ソースコード

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.utils.getTimer;
	import flash.utils.setTimeout;
	
	/**
	 * アクセスの速い配列を使うサンプル
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * 結果表示用テキストフィールド
		 */
		private var textField:TextField;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化メソッド
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// テキストフィールドの準備
			textField = new TextField();
			textField.autoSize = TextFieldAutoSize.LEFT;
			textField.x = 10;
			textField.y = 10;
			addChild(textField);
			
			// 500 ms 後にテスト開始
			// Flash 読み込み直後は負荷が高いことがあるので、
			// それを避けてテストを実行する。
			setTimeout(startTest, 500);
		}
		
		/**
		 * テスト用メソッド
		 */
		private function startTest():void 
		{
			// 実行時間の計測開始
			var time:int;
			textField.appendText("Flash 10 でアクセス速度の速い配列を使うテスト\n\n");
			
			// Array に Push するテスト
			time = benchmark(arrayPushTest);
			textField.appendText("- Array に値を 100000 個挿入する時間 : ");
			textField.appendText(time.toString() + "ms\n");
			
			// Vector に Push するテスト
			time = benchmark(vectorPushTest);
			textField.appendText("- Vector.<int> に値を 100000 個挿入する時間 : ");
			textField.appendText(time.toString() + "ms\n");
			
			textField.appendText("\n");
			
			// Array のメモリを事前に確保してから代入するテスト
			time = benchmark(arrayPushTest2);
			textField.appendText("- Array のメモリを確保してから\n  値を 100000 個分代入する時間 : ");
			textField.appendText(time.toString() + "ms\n");
			
			// Vector のメモリを事前に確保してから代入するテスト
			time = benchmark(vectorPushTest2);
			textField.appendText("- Vector.<int> のメモリを確保してから\n  値を 100000 個分代入する時間 : ");
			textField.appendText(time.toString() + "ms\n");
			
			textField.appendText("\n");
			
			// Array のメモリを確保した後、順番に参照するテスト
			time = benchmark(arrayRefTest);
			textField.appendText("- Array のメモリを確保してから\n  値を 100000 回順番に参照する時間 : ");
			textField.appendText(time.toString() + "ms\n");
			
			// Vector のメモリを確保した後、順番に参照するテスト
			time = benchmark(vectorRefTest);
			textField.appendText("- Vector のメモリを確保してから\n  値を 100000 回順番に参照する時間 : ");
			textField.appendText(time.toString() + "ms\n");
		}
		
		//-----------------------------------------------------------
		
		/**
		 * メソッドの実行時間を計る
		 * @param	f	実行時間を計りたいメソッド
		 * @return	実行時間 (ミリ秒)
		 */
		private function benchmark(f:Function):int
		{
			var time:int;
			time = getTimer();
			f();
			return getTimer() - time;
		}
		
		//-----------------------------------------------------------
		
		/**
		 * Array に Push するテスト
		 */
		private function arrayPushTest():void 
		{
			var array:Array;
			array = new Array();
			
			for (var i:int = 0; i < 100000; i++)
				array.push(i);
		}
		
		/**
		 * Vector に Push するテスト
		 */
		private function vectorPushTest():void 
		{
			var vector:Vector.<int>;
			vector = new Vector.<int>;
			
			for (var i:int = 0; i < 100000; i++)
				vector.push(i);
		}
		
		/**
		 * Array のメモリを事前に確保してから代入するテスト
		 */
		private function arrayPushTest2():void 
		{
			var array:Array;
			array = new Array(100000);
			
			for (var i:int = 0; i < 100000; i++)
				array[i] = i;
		}
		
		/**
		 * Vector のメモリを事前に確保してから代入するテスト
		 */
		private function vectorPushTest2():void 
		{
			var vector:Vector.<int>;
			vector = new Vector.<int>;
			vector.length = 100000;
			
			for (var i:int = 0; i < 100000; i++)
				vector[i] = i;
		}
		
		/**
		 * Array のメモリを確保した後、順番に参照するテスト
		 */
		private function arrayRefTest():void 
		{
			var n:int;
			var array:Array;
			array = new Array(100000);
			
			for (var i:int = 0; i < 100000; i++)
				n = array[i];
		}
		
		/**
		 * Vector のメモリを確保した後、順番に参照するテスト
		 */
		private function vectorRefTest():void 
		{
			var n:int;
			var vector:Vector.<int>;
			vector = new Vector.<int>;
			vector.length = 100000;
			
			for (var i:int = 0; i < 100000; i++)
				n = vector[i];
		}
	}
	
}
		

Vector は、C++ のテンプレートクラスや、 Java のジェネリッククラスと同じように機能します。
配列に入れることのできるクラスは制限されますが、その分アクセスが速くなります。
自作のクラスも、Vector を使って配列にすることができます。

また、Vector クラスには fixed というプロパティがあって、
これを True に設定することで、固定長の配列を作ることができます。
オブジェクト初期化時は False に設定されています。


FlashDevelop で Flash Player 10 対応の SWF を作る時は、
プロジェクトのプロパティ画面を開いて、ターゲットプラットフォームを
Flash Player 10 に設定してください。


ここで Flash Player 10 を選択します。

外部リンク