2010年12月24日金曜日

Tweenの高速化についてまとめ。その3

また内容がコアな感じになるが、次はJITの話。

アニメーションライブラリにエラーハンドリングを入れる際に気づいたのが、JITを殺すようなコードを書いてはいけないということ。そもそもFlashにおけるJITとは何か。それはバイトコードをインタプリタで動かしている状態で、よく使われる箇所をネイティブコードに動的に置き換えてしまう技術である。正式な名前はJust In Time Compilerである。

ではJITを殺すようなコードとは何か。まずはサンプルを見たほうが早い。

try/catchによってJITが効かなくなる件の検証 - wonderfl build flash online

大きく違うのが、関数の中にtry/catchが含まれているかの部分である。実行されるかは関係ない。他に検証してみたが、with句と関数定義が含まれているケースでも、JITが効いていないのが確認できた。

逆に言うとtry/catch/with/functionが含まれていなければJITの対象となるようである。上記コードでもtry/catchの部分だけ関数化した検証も含んでいるが、JITが効いているようである。

確認はしていないが、コンストラクタもJITは効かないようである。「関数呼び出しの時間」 < 「JIT無効の処理時間」 - 「JIT有効の処理時間」を満たすようなコード、簡単に言うとコンストラクタが忙しいコードの場合は、コンストラクタ内に書いているコードを初期化関数の呼び出しに変えて、初期化関数内で忙しい処理を行えば良い。ただし、関数呼び出しのオーバーヘッドを考慮する必要がある。

とは言え、最適化の話であるので、呼ばれる頻度の低いケースに置いては可読性や可用性を重視した方がよい。最適化原理主義者になってはいけない。

0 件のコメント:

コメントを投稿