ホーム > タグ > as2
as2
AS2で遅くなる書き方を研究しようか
- 2008-05-28 (水)
- ActionScript | flash
上条さんとこで、AS2でOOPをやると遅くなる可能性があると書いてあって泣いた。
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 | |
|---|---|---|---|---|---|
| タイムライン | 228 | 230 | 708 | 455 | |
| クラス | 102 | 101 | 245 | 313 | 227 |
ループ処理だけでの単純な比較なので、あまりあてにならない。
実際のところどっちが速いのかよくわからん、という結果になった。とりあえず、タイムラインでの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]++; 94 93 106
- Comments: 2
- Trackbacks: 0
Home > Tags > as2
- Search
- Feeds
- Meta