Successfully reported this slideshow.
Your SlideShare is downloading. ×

Froyo DalvikVM JIT

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 20 Ad
Advertisement

More Related Content

Slideshows for you (20)

Advertisement

More from Tetsuyuki Kobayashi (20)

Advertisement

Recently uploaded (20)

Froyo DalvikVM JIT

  1. 1. Froyo の DalvikVM の JIT Google I/O のセッションの解説 Tetsuyuki Kobayashi
  2. 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 2
  3. 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 3
  4. 4. Dalvik インタプリタ  普通は 1/3 の時間しかインタプリタで消費されてい ない。  OS や性能に効くところはネイティブコードで書かれ ているから。  通常のアプリケーションには充分。  それでも CPU 喰いのアプリには  NDK でネイティブ化  JIT コンパイラ 4
  5. 5. どんな JIT?  いつコンパイルするか  インストール時、起動時、メソッド呼び出し時、命 令フェッチ時  何をコンパイルするか  プログラム全体、共有ライブラリ、ページ、メソッ ド、トレース、命令 5
  6. 6. どんな JIT?  それぞれの組み合わせに利点と欠点がある  Android で重視する点  最小限の追加メモリ  DalvikVM のコンテナベースのセキュリティモデ ル  起動してすぐに加速する  インタプリタとコンパイル済みコードの間のス ムーズな遷移 6
  7. 7. メソッド単位の JIT  ほとんどのサーバ用 Java の JIT はこのタイプ  ホットなメソッドをみつけてメソッド単位でコンパイル とオプティマイズを行う  利点  より大きな最適化のウィンドウ  メソッド呼び出しのところで仮想マシンの状態を同期  欠点  ホットメソッドの中のコールドコードもコンパイルされる  コンパイル中にずっと大きなメモリが必要  メソッドがホットになってからコンパイルして実行される までのディレイが大きい 7
  8. 8. トレース単位の JIT  ホットな実行経路をさがしながらインタープリタが実 行される。  コンパイルしたコードの断片はトランスレーション キャッシュの中につながれる  利点  ホットコードしかコンパイルされないのでメモリ消費が最 小限。  ホットなコードのコンパイル、実行までが素早い。  欠点  最適化の範囲が狭いので、ピーク性能が制限される。  インタープリタとの状態の同期の回数がずっと多い。  プロセスをまたがってトランスレーションキャッシュを共 8 有することが難しい。
  9. 9. 9
  10. 10. 決断:トレース JIT から始めることにした  使用メモリを最小限にすることがモバイルデバイス では最重要。  素早く性能向上があることが重要。  JIT のために長時間かかるとその間にユーザはあきら めてしまうかも。  メソッド単位の JIT と補完する可能性を残す  両者は共存可能。  モバイルデバイスも電源につながっている時はサーバ のように見える。  いいとこ取り  バッテリ駆動時はトレース JIT  充電中はバックグランドでメソッド JIT 10
  11. 11. Dalvik Trace JIT Flow 11
  12. 12. Dalvik JIT v1.0 Overview  インタプリタとの密接な統合  JIT をインタプリタの拡張と考えると便利  インタプリタはプロファイルを行ってホットなコードを みつけたらモードを切り替える  トレース要求はインタープリット中に処理される  実際の実行中の値にアクセスできる  トレースには少なくとも一回以上は実行できたところだ けが含まれることが保証されている。 ( ある種の最適化 で便利)  トレース要求はコンパイラスレッドに渡され、そこで ネイティブコードにコンパイルされる。  コンパイルしたコードはトランスレーションキャッ 12 シュにつながれる。
  13. 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 13  Induction variable optimization
  14. 14. ベンチマーク結果 14
  15. 15. 次の方向性  メソッドのインライン化  Trace extension  Persistent profile information  Off-line trace coalescing  Off-line method translation  チューニング、チューニング、もっとチューニング! 15
  16. 16. ケーススタディ  Robo Defence というアクション系のゲーム  75% の時間は skia 描画ライブラリ  DalvikVM ではわずか 4%  JIT で向上する部分は DalvikVM での部分だけなの で、このゲームでは JIT の効果はわずか  Checker というパズルゲーム  大半の時間を DalvikVM の実行が占める。  このケースは JIT の効果が高い。 5.4 倍の向上。  これに JIT を適用した結果 94% の時間は JIT の コードキャッシュの中。 16
  17. 17. Code Cache の中を覗いてみると  起動から 20 分間で  9898 回コンパイル 合 計 796264 バイト (1 回あたり 80 バイト)  生成したネイティブコードサイズは元の Dex コードの約 7.7 倍。  コンパイルの合計時間は 6 秒 (1 回の平均は 0.6msec) 17
  18. 18. まとめ  リソースを喰わない Dalvik JIT compiler  追加のメモリ要求量はわずか 100KB  バイトコード実行速度で 2 ~ 5 倍の向上  さらなるチューニングの予定 18
  19. 19. 感想  普通の JIT の弱点  コンパイルによるもたつき、起動時間増加  メモリ消費増大 → GC 頻発 → もたつき  Dalvik の JIT はこれらの弱点を上手におさえこんで いるところが素晴らしい!   ソースが公開が楽しみ  何かわかったらまたどこかで話します。 19
  20. 20. Thank you Thank you for listening! Special thanks to @yoshi_rr and @kojira, who USTREAMed this session to us. 20

×