スタッフのブログです。個以上あるコメントは受け付けない設定になってます。I/OのキーノートでAndroid2.2(コードネーム:Froyo)でJITコンパイラが搭載されることが発表されました。JITに関するセッションもありました。私はサンフランシスコに行ったわけではありませんが、現地からUSTREAM中継してくれた方がいたおかげでセッションのスライドを見ることができました。Waveにも有用な情報が載っています。それらから情報を拾ってまとめてみました。いつコンパイルするか?何をコンパイルするか?通常のJITコンパイラはメソッド単位でコンパイルを行いますが、それ以外の方法としては、メソッドの一部のみをコンパイルする方法があります。JIT"と呼んでいます。後者はインタープリタの中で実行頻度の高い部分を見つけておいて、その部分だけをコンパイルします。実際にはJITコンパイルは別スレッドで行います。コンパイルすると決めた部分はコンパイルスレッドのキューに積んでおきます。最適化されたコードを生成するという点ではメソッド単位のコンパイルに軍配が上がりますが、トレースコンパイルの方がスピードとサイズの点で優れていることがわかりました。それでAndoridではトレースコンパイルを採用したそうです。将来的には両方のよいところを組み合わせて使えるようにするそうです。性能評価ベンチマークテストでは2-6倍の性能向上が見られました。実際のアプリケーションでOProfileというツールでプロファイル計測をしてみました。Defenceというアクション系のゲームでは75%の時間はskia描画ライブラリでDalvikVMではわずか4%でした。JITで向上する部分はDalvikVMでの部分だけなので、このゲームではJITの効果はほとんど現れてきません。Checkerというパズルゲームでは大半の時間をDalvikVMの実行が占めていました。このケースはJITの効果が高いです。これにJITを適用した結果94%の時間はJITのコードキャッシュの中の実行になりました。JITのコードキャッシュはそんなに大きなものではありません。それが一杯になった時には全て消去してまた最初からやりなおします。(どれを消してどれを残すという判断をするしくみは無い。コンパイルが充分速いならば、このほうが合理的。(1回あたり80バイト)生成したネイティブコードサイズは元のDexコードから約7.7倍。(1回の平均は0.6msec)ここで目を引くのがコンパイル時間の短さです。トレースコンパイルでコンパイルの単位を小さくしたことが奏功しています。一回の平均時間は0.6msecはかなり短いと思います。ガベージコレクションで一回に数十msecかかることと比較すると誤差の範囲です。やってJITコンパイラをデバッグするかセッションスライドの最後の方はどうやってJITコンパイラをデバッグするかという話でした。stepで確認したりするそうです。このあたりはこのセッションの動画が公開されたらまた見てみたいところです。OneではすでにFroyoへのアップデートが始まっているそうですが、アップデートしても体感的な速度は「あまり変わらない」そうです。通常のアプリの実行ではDalvikVMはボトルネックではないのでJITによってはっきりわかるほど速くなることはないわけですが、逆にJITの欠点であるコンパイルすることによる動作のもたつきを体感的にわからない程度に軽減しているのは優秀です。ソースが公開されたらまたじっくり調べてみようと思います。2010.5.27追記DalvikVMの開発者のブログによると、今回のJITで2つの点を特に誇りに思っているそうです。コンパイル時間の短さ(コンパイルによるディレイがほとんど感じられない)メモリ消費量の少なさ。(100KB程度の追加のワークメモリで充分動かせる)確かにこの点で素晴らしい。2010.5.31追記Eclairで入っていた実験版のJITの話はこちらのスライドの後半をどうぞ。I/O報告会で話をしました。最新コメント「最新トラックバック」は提供を終了しました。(2)タグクラウドABCadbaidlAndroidARMarmv7asmbinderbionicBootbuildbuildrootbuiltinbusyboxcccacheCELFcelfjpClangcortex-a8Cortex-A9cpuinfodalvikvmDebiandebuggerdDMAelcembeddedemulatorEventexeGCCFlashfpufroyogccGDBGingerbreadgoldfishIceCreamSandwichinitinitrdinterpreterJAVAjavacjavapjitK&Rkernelkeykzm-a9-dualKZM-A9-GTkzm-ca9-01LinarolinuxLLVMloglogcatltsimingwMIPSmultiarchndkneonnetinstallnfsnon-stopobjdumppartnerPARTNER-JetportingpowermanagementprintfpropertyPyMitepythonqemuQTQTextCodecrootstockrubysdServiceSHsimdsmpTCGtuninguartubootUbuntuuclibcUNIXUSBv8vlinkwakelockwirelessx86zygote計測QRコード京都マイクロコンピュータ。