[2009-11-25] 一時オブジェクト vs オブジェクトの使いまわし
♥0 |
Line 72 |
Modified 2009-11-25 10:27:13 |
MIT License
archived:2017-03-09 17:32:26
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++;
}
}