ホーム > タグ > as2

as2

AS2で遅くなる書き方を研究しようか

上条さんとこで、AS2でOOPをやると遅くなる可能性があると書いてあって泣いた。

AS3 で動的言語のススメ

AS2 における型の使用は、オーサリング時の ”生産性向上のベストプラクティス” としての位置づけ以上ではないわけです。実際 OOP をまじめに追求するほど AS2 のアプリケーションは遅くなる傾向を持っています。

気になったので、単純なカウントアップでベンチマークをとった。

試したところは以下

  • タイムラインに書くかクラスに書くか
  • 型宣言の有無
  • 処理をfunctionにくるむかどうか

AS2でタイムラインに書く。型宣言はなし

//型宣言なし
var startTime = getTimer();
var trialNum = 100000;
var cnt = 0;

for (var i:Number = 0; i < trialNum; i++) {
	cnt++;
}
benchmark();

function benchmark()
{
	var endTime = getTimer();
	trace("time: " + (endTime - startTime)); 
}
//だいたい228

AS2でタイムラインに書く。型宣言あり・カウントアップは生で書く

//型宣言あり
var startTime:Number = getTimer();
var trialNum:Number = 100000;
var cnt:Number = 0;

for (var i:Number = 0; i < trialNum; i++) {
	cnt++
}

benchmark();

function benchmark()
{
	var endTime:Number = getTimer();
	trace("time: " + (endTime - startTime));
}

//だいたい230

AS2でタイムラインに書く。型宣言あり・カウントアップはfunctionにくるむ

リファクタリングの本やOOPの本を読んでいると、できるだけ細かいfunctionに分けるべきだ、と書いてある。確かにそのほうがやりやすいが、やればやるほど遅くなる気はしていた。

//型宣言あり,function
var startTime:Number = getTimer();
var trialNum:Number = 100000;
var cnt:Number = 0;

for (var i:Number = 0; i < trialNum; i++) {
	countUp();
}

benchmark();

function countUp():Void
{
	cnt++;
}

function benchmark():Void
{
	var endTime:Number = getTimer();
	trace("time: " + (endTime - startTime));
}

//だいたい709

クラスに書く

クラスに書いてみた。やってる中身は上とほとんど一緒。試したのは以下。

  • 型あり
  • 型あり・function
  • 型あり・別クラスstatic function
  • 型あり・別クラスを参照static function 「型あり・別クラスstatic function」は
    for (var i:Number = 0; i < trialNum; i++) {
    	cnt = sandbox.BenchTest.countUp(cnt);
    }

「型あり・別クラスstatic function」は

var test:BenchTest = BenchTest;
for (var i:Number = 0; i < trialNum; i++) {
	cnt = test.countUp(cnt);
}

AS2速度まとめ

型なし型あり型あり・function型あり・別クラスstatic function型あり・別クラスを参照static function
タイムライン228230708455
クラス102101245313227

ループ処理だけでの単純な比較なので、あまりあてにならない。

実際のところどっちが速いのかよくわからん、という結果になった。とりあえず、タイムラインでのfunctionがやたら遅いということがわかった。アクティベーションオブジェクトのせいだろうか。

でも、OOPにのっとってめちゃくちゃ細かく分割すると、遅くなることは事実だろう。わりと、お茶濁しな結果に!

AS3とAS2での差はクラスのメンバにあるかどうかでかなり変わる

AS3では

var point:Point = new Point(x,y)
point.x++;

と書くとめちゃくちゃ早い。メンバ変数であるかどうかがかなりの違いの模様。

これを単なるオブジェクトとして扱うとめちゃんこ遅くなる。ハッシュがどうのこうのらしい。配列はそこそこ早い。 PointとArrayで速度比較

var obj:Object = new Object();
obj.x = 1;
obj.x++;

AS2ではどれをやってもほとんど同じ速度だった。

さっさとAS3に全部移りたいぜ!

//var point:Point = new Point(1, 1);
//var obj:Object = new Object();
//obj.x = 1;
var array:Array = [1];
for (var i:Number = 0; i < trialNum; i++) {
	//point.x++;
	//obj.x++;
	array[0]++;
}
AS2でメンバとかの速度
point.x++;obj.x++;array[0]++;
9493106

Home > Tags > as2


Search
Feeds
Meta

Return to page top