[2009-11-25] 一時オブジェクト vs オブジェクトの使いまわし

by hikipuro
♥0 | Line 72 | Modified 2009-11-25 10:27:13 | MIT License
play

ActionScript3 source code

/**
 * Copyright hikipuro ( http://wonderfl.net/user/hikipuro )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/rHRI
 */

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	
	public class Main extends Sprite 
	{
		/**
		 * テストする回数
		 */
		private const TEST_COUNT:int = 10;
		
		/**
		 * 1 回のテストでループする回数
		 */
		private const LOOP_COUNT:int = 100000;
		
		/**
		 * 結果表示用テキストフィールド
		 */
		private var textField:TextField;
		
		/**
		 * オブジェクトの配列 
		 */
		private var objects:Vector.<TestClass>;
		
		/**
		 * コンストラクタ
		 */
		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;
			addChild(textField);
			textField.text = "一時オブジェクト vs オブジェクトの使いまわし\n";
			textField.appendText("テスト回数: " + TEST_COUNT + "\n");
			textField.appendText("1 回のテストでループする回数: " + LOOP_COUNT + "\n\n");
			
			// 使いまわすオブジェクトの準備
			objects = new Vector.<TestClass>();
			for (var i:int = 0; i < LOOP_COUNT; i++) {
				objects.push(new TestClass());
			}
			
			// テスト開始
			textField.appendText("一時オブジェクト\n");
			textField.appendText(benchmark(test1, TEST_COUNT, LOOP_COUNT));
			textField.appendText("\nオブジェクトの使いまわし\n");
			textField.appendText(benchmark(test2, TEST_COUNT, LOOP_COUNT));
		}
		
		/**
		 * 一時オブジェクトのテスト
		 * @param	i
		 */
		private function test1(i:int):void 
		{
			new TestClass().test();
		}
		
		/**
		 * 使いまわすオブジェクトのテスト
		 * @param	i
		 */
		private function test2(i:int):void 
		{
			objects[i].test();
		}
		
		/**
		 * 処理時間計測
		 * @param	f			計測する関数
		 * @param	testCount	テストする回数
		 * @param	loopCount	1 回のテストでループする回数
		 * @return	テスト結果の文字列
		 */
		private function benchmark(f:Function, testCount:int, loopCount:int):String 
		{
			var str:String = "";
			var sum:Number = 0;
			for (var j:int = 0; j < testCount; j++) {
				var st:Number = new Date().time;
				for (var i:int = 0; i < loopCount; i++) {
					f(i);
				}
				var ed:Number = new Date().time;
				sum += (ed - st);
				str += (ed - st).toString() + ", "; 
			}
			str += "\n平均処理時間: " + (sum / testCount).toString() + "ms\n";
			return str;
		}
	}
}

    class TestClass 
	{
		private var i:int = 0;
		public function TestClass() 
		{
			
		}
		
		public function test():void 
		{
			i++;
		}
	}