Accessor Performance Test

by hycro
アクセッサのパフォーマンステスト
test1 の結果が不思議.
♥0 | Line 216 | Modified 2010-06-19 00:45:11 | MIT License
play

ActionScript3 source code

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

// アクセッサのパフォーマンステスト
// test1 の結果が不思議.
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	import flash.utils.getTimer;
	
	public class AccesserPerformanceTest extends Sprite {
		private static const LOOP_NUM:uint = 5000000;
		
		private var _tf:TextField;
		
		public function AccesserPerformanceTest() {
			_tf = new TextField();
			_tf.width = stage.stageWidth;
			_tf.height = stage.stageHeight;
			addChild(_tf);
			
			test1();
			test2();
			test3();
			test4();
			test5();
			test6();
			test7();
			test8();
			test9();
		}
		
		private function test1():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			var obj:Object = {};
			
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.obj = obj;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.obj = obj;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("object(set only)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");			_tf.appendText("\n");
		}
		
		private function test2():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			var str:String = "string";
			
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.str = str;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.str = str;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("string(set only)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");			_tf.appendText("\n");
		}
		
		private function test3():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.num = 1;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.num = 1;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("int(set only)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");			_tf.appendText("\n");
		}
		
		private function test4():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.obj;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.obj;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("object(get only)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");			_tf.appendText("\n");
		}
		
		private function test5():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.str;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.str;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("string(get only)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");			_tf.appendText("\n");
		}
		
		private function test6():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.num;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.num;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("int(get only)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");
			_tf.appendText("\n");
		}
		
		private function test7():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.obj = classA.obj;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.obj = classB.obj;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("object(set/get)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");			_tf.appendText("\n");
		}
		
		private function test8():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.str = classA.str;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.str = classB.str;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("string(set/get)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");			_tf.appendText("\n");
		}
		
		private function test9():void {
			var classA:ClassA = new ClassA();
			var classB:ClassB = new ClassB();
			var st:uint = getTimer();
			for (var i:uint = 0; i < LOOP_NUM; i++) {
				classA.num += 1;
			}
			var ed:uint = getTimer();
			
			var st2:uint = getTimer();
			for (var j:uint = 0; j < LOOP_NUM; j++) {
				classB.num += 1;
			}
			var ed2:uint = getTimer();
			
			_tf.appendText("int(set/get)------------------------\n");
			_tf.appendText("classA > " + (ed - st) + " ms\n");
			_tf.appendText("classB > " + (ed2 - st2) + " ms\n");			_tf.appendText("\n");
		}
	}
}


class ClassA {
	public var obj:Object = {};
	public var str:String = "string";
	public var num:int = 0;
}

class ClassB {
	private var _obj:Object = {};
	private var _str:String = "string";
	private var _num:int = 0;

	public function get num():int
	{
		return _num;
	}

	public function set num(value:int):void
	{
		_num = value;
	}

	public function get str():String
	{
		return _str;
	}

	public function set str(value:String):void
	{
		_str = value;
	}

	public function get obj():Object
	{
		return _obj;
	}

	public function set obj(value:Object):void
	{
		_obj = value;
	}
}