« 2009年12月 | トップページ | 2011年4月 »

2010年4月24日 (土)

ActionScript3 パフォーマンスチューニング メモ2

Flash Player 10 で採用された「Vector」は型を指定でき、Arrayよりも高速に動作します。

しかしながら、使い方を誤ると痛い目にあいます。

・・・
■new Vectorは、new Array よりも遅し

 new Vector.( ) ;

 new Array( ) ;

よりも遅いです。こちらのテストでは、length 1000の配列生成で4倍ほど new Vectorの方が遅くなりました。

あまりやらないかもしれませんが、小さな配列を沢山作っては消すような場合は、Arrayの方が速くなります。

・・・

■型の違うVectorの受け渡しは遅し


 Vector. を、Vector. を受けるようなメソッドに渡すのも、それなりにコストがかかります。例えば、何らかのルールでVectorを並べ変えるメソッド

 function narabekae( v:Vector.<*> ):void

を用意して、

 var v1:Vector. ;
 narabekae( Vector.<*>( v1 ) ) ;


のように呼び出す場合、 Vector. を Vector.<*> に渡す時点で、負荷が発生します。
Vector.からVector.<*>へキャストのような処理をするわけですが、実際には「Vector() グローバル関数」という関数が呼ばれており、少しだけ負荷があります。Vectorのlengthに比例して負荷が大きくなるわけではないので通常はさほど問題ではないと思います。

しかしながら、ArrayからVectorに変えて高速化を行ったつもりが、少しずつ負荷が上がってしまうこともあるので、何でもVectorにすればいいというものではないようです。

※このあたりはランタイムの実装によって変わる可能性もあると思われます。テストは 2010/04/24時点の最新版で行っております。

4月 24, 2010 ActionScript | | コメント (1) | トラックバック (0)

ActionScript3 パフォーマンスチューニング メモ1

-----
タイトル入力後に、間違ってEnter押したところ、なにも書いていない状態でアップしてしまいました。。ので、以下全文が追記(笑)
-----

近頃、ActionScript3のパフォーマンス向上に(も)取り組んでいるので、そのメモ。


■メモ1) 「リリースビルド」と「デバッグビルド」では、パフォーマンス要因(?)が異なる

Flash Builder(旧FlexBuilder)では、「プロジェクト>リリースビルドの書き出し」からリリース用の swf が出力されます。以下、「リリースビルド」に対して、通常のビルドを「デバッグビルド」と呼んでおきます。

デバッグビルドで、

 処理Aのパフォーマンス > 処理Bのパフォーマンス

という結果が出たので、処理Aの方を選んでみたとしても、配布するときのリリースビルドでは同じであったり、逆転したりということがあり得ます。

極端な例では、

//処理A
for( i = 0 ; i < MAX ; i ++ ){
z ++ ;
z ++ ;
z ++ ;
//( z++ を 100回ぐらい下に書く)
}

と、同じ内容の処理

//処理B
for( i = 0 ; i < MAX ; i ++ ){
z ++ ;z ++ ; z ++ ; //( z++ を 100回ぐらい横に書く)
}

で計測すると、デバッグビルドでは、処理Bの方が10倍速くなったり 100倍、1000倍になったりします。どれだけ早くなるかは、z++ をいくつ書くかによって変わります。しかし、リリースビルドではまったく同じ速度になります。

原因は不明ですが(ブレイクポイントを挟める仕組みが影響している?)、この現象を信じてパフォーマンスチューニングを行ってしまうと痛い目にあいます。というか、私があいました(涙)。

・・・

二つの処理を比較するときは、厳密にはリリースビルドで行わないといけないということです。

とくに注意すべきは、AとBのアルゴリズム比較で、原理的にBの方が高速なはずなのに、Bの方が行数が多い場合、結果は逆転することがあるということです。速いアルゴリズムの方が、長い記述になる状況は頻発するので注意が必要です。

結論としては、「デバッグビルドでのパフォーマンス計測を当てにするな」ということです。

本当に重要な箇所(ホットスポット?)は、リリースビルドして、サーバにアップして比較しましょう。

4月 24, 2010 ActionScript | | コメント (0) | トラックバック (0)