froyo dalvikvm jit
DESCRIPTION
Japanese translation of Google I/O Dalvik JIT sessionTRANSCRIPT
Froyo の DalvikVM の JIT
Google I/O のセッションの解説
Tetsuyuki Kobayashi
2
Who am I?
20+ years involved in embedded systems 10 years in real time OS, such as iTRON 10 years in embedded Java Virtual Machine Now Gcc, Linux, QEMU, Android, …
Blogs http://d.hatena.ne.jp/embedded/ (Personal) http://blog.kmckk.com/ (Corporate)
Twitter @tetsu_koba
3
Today's topic
Google I/O での DalvikVM の JIT のセッションを読み解こう
”A JIT Compiler for Android's Dalvik VM” Ben Cheng, Bill Buzbee このセッション資料をわかるところだけ訳出し
てみました。
http://code.google.com/intl/ja/events/io/2010/sessions/jit-compiler-androids-dalvik-vm.html
4
Dalvik インタプリタ
普通は 1/3 の時間しかインタプリタで消費されていない。
OS や性能に効くところはネイティブコードで書かれているから。
通常のアプリケーションには充分。 それでも CPU 喰いのアプリには
NDK でネイティブ化 JIT コンパイラ
5
どんな JIT?
いつコンパイルするか インストール時、起動時、メソッド呼び出し時、命
令フェッチ時 何をコンパイルするか
プログラム全体、共有ライブラリ、ページ、メソッド、トレース、命令
6
どんな JIT?
それぞれの組み合わせに利点と欠点がある Android で重視する点
最小限の追加メモリ DalvikVM のコンテナベースのセキュリティモデ
ル 起動してすぐに加速する インタプリタとコンパイル済みコードの間のス
ムーズな遷移
7
メソッド単位の JIT
ほとんどのサーバ用 Java の JIT はこのタイプ ホットなメソッドをみつけてメソッド単位でコンパイル
とオプティマイズを行う 利点
より大きな最適化のウィンドウ メソッド呼び出しのところで仮想マシンの状態を同期
欠点 ホットメソッドの中のコールドコードもコンパイルされる コンパイル中にずっと大きなメモリが必要 メソッドがホットになってからコンパイルして実行される
までのディレイが大きい
8
トレース単位の JIT
ホットな実行経路をさがしながらインタープリタが実行される。
コンパイルしたコードの断片はトランスレーションキャッシュの中につながれる
利点 ホットコードしかコンパイルされないのでメモリ消費が最
小限。 ホットなコードのコンパイル、実行までが素早い。
欠点 最適化の範囲が狭いので、ピーク性能が制限される。 インタープリタとの状態の同期の回数がずっと多い。 プロセスをまたがってトランスレーションキャッシュを共
有することが難しい。
9
10
決断:トレース JIT から始めることにした
使用メモリを最小限にすることがモバイルデバイスでは最重要。
素早く性能向上があることが重要。 JIT のために長時間かかるとその間にユーザはあきら
めてしまうかも。
メソッド単位の JIT と補完する可能性を残す 両者は共存可能。 モバイルデバイスも電源につながっている時はサーバ
のように見える。 いいとこ取り
バッテリ駆動時はトレース JIT 充電中はバックグランドでメソッド JIT
11
Dalvik Trace JIT Flow
12
Dalvik JIT v1.0 Overview
インタプリタとの密接な統合 JIT をインタプリタの拡張と考えると便利
インタプリタはプロファイルを行ってホットなコードをみつけたらモードを切り替える
トレース要求はインタープリット中に処理される 実際の実行中の値にアクセスできる トレースには少なくとも一回以上は実行できたところだ
けが含まれることが保証されている。 (ある種の最適化で便利)
トレース要求はコンパイラスレッドに渡され、そこでネイティブコードにコンパイルされる。
コンパイルしたコードはトランスレーションキャッシュにつながれる。
13
Dalvik JIT v1.0 Features
プロセスごとのトランスレーションキャッシュ。(セキュリティサンドボックスの中でのみ共有。)
シンプルなトレース。一般的にひとつかふたつのベーシックブロックの分だけ。
Local optimizations Register promotion
Load/store elimination
Redundant null-check elimination
Heuristic scheduling
Loop optimizations Simple loop detection
Invariant code motion
Induction variable optimization
14
ベンチマーク結果
15
次の方向性
メソッドのインライン化 Trace extension Persistent profile information Off-line trace coalescing Off-line method translation チューニング、チューニング、もっとチューニング!
16
ケーススタディ
Robo Defenceというアクション系のゲーム 75%の時間は skia描画ライブラリ DalvikVMではわずか 4% JIT で向上する部分は DalvikVMでの部分だけなので、このゲームでは JITの効果はわずか
Checkerというパズルゲーム 大半の時間を DalvikVMの実行が占める。 このケースは JITの効果が高い。 5.4倍の向上。 これに JITを適用した結果 94%の時間は JITのコードキャッシュの中。
17
Code Cache の中を覗いてみると
起動から 20 分間で 9898回コンパイル 合計796264バイト (1 回あたり 80 バイト)
生成したネイティブコードサイズは元の Dexコードの約7.7倍。
コンパイルの合計時間は 6秒 (1 回の平均は0.6msec)
18
まとめ
リソースを喰わない Dalvik JIT compiler 追加のメモリ要求量はわずか 100KB
バイトコード実行速度で 2~ 5倍の向上 さらなるチューニングの予定
19
感想
普通の JIT の弱点 コンパイルによるもたつき、起動時間増加 メモリ消費増大 → GC頻発 → もたつき
Dalvik の JIT はこれらの弱点を上手におさえこんでいるところが素晴らしい!
ソースが公開が楽しみ 何かわかったらまたどこかで話します。
20
Thank you
Thank you for listening!
Special thanks to @yoshi_rr and @kojira, who USTREAMed this session to us.