Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Javaで使えるもう一つのコンパイル方式 AOT … を無理やりwindowsでやってみた話

487 views

Published on

2017/12/27 のJJUG ナイトセミナー年送りビール&LT大会 でのライトニングトークの発表内容です。

Java 9 で導入されたAOTコンパイル(事前コンパイル)ですが、まだLinux版Java 9でしか動作しません。これをWindows Subsystem for Linux上で無理やり動作させたお話です。

Published in: Software
  • Be the first to comment

  • Be the first to like this

Javaで使えるもう一つのコンパイル方式 AOT … を無理やりwindowsでやってみた話

  1. 1. Javaで使えるもう一つのコンパイル方式 - AOT … を無理やりWindowsでやってみた話 【東京】JJUG ナイトセミナー: 年送りビール&LT大会 2017/12/27 松原 正和 https://a5m2.mmatsubara.com
  2. 2. 松原正和 - 自己紹介 A5:SQL Mk-2の作者 ・SQL&ER図ツール 双子のパパ ・5歳になったよ 本人 https://a5m2.mmatsubara.com 20年開発してます。
  3. 3. JJUG CCC 2017 Fall (2017/11/18)にて 西川彰広さんのセッション「Javaで使えるも う一つのコンパイル方式 - AOT」が大変面白 かったです。 https://a5m2.mmatsubara.com Java 9から導入された AOTコンパイル方式のお話。
  4. 4. AOTコンパイラとは AOTコンパイラの役割 ・これまではアプリケーション開始時にJavaインタプリタが動作 →その後JITコンパイル ・事前にAOTコンパイラでclassファイルをネイティブコードに 変換 ・アプリケーション起動時にインタプリタ動作で時間がかかる のを抑制する https://a5m2.mmatsubara.com
  5. 5. やってみたい!! …だが、Java 9ではLinux版のみ!。 俺はWindowsプログラマなんだ!!。 …でも、あきらめない!。 我々にはWindows Subsystem for Linux があるじゃあないか!!。 ※ Windows Subsystem for Linuxとは Windows 上でLinuxカーネルをエミュレーションし、その上で Ubuntuとか動かしたりする。仮想化ではない。 https://a5m2.mmatsubara.com 20年来の。
  6. 6. やってみた!! 手持ちのソートアルゴリズムとか動かしてみる。 ・10,000,000件の乱数ソートを10回動かすベンチマーク https://a5m2.mmatsubara.com JITコンパイルだと、 アルゴリズムに よって初回実行が 遅いことがある。
  7. 7. コマンド ■AOTコンパイルは jaotcコマンド ■実行時オプション $ jaotc --output ../mmsort.so mmsort/*.class $ java -classpath bin -XX:AOTLibrary=./mmsort.so mmsort.SortTest mmsort.Mas4Sort 10000000 R I 10 共有ライブラリ形式で出力される -XX:AOTLibraryオプションで指定 https://a5m2.mmatsubara.com
  8. 8. 結果 ・AOTなし(JITコンパイル) 初回実行:7.6秒前後、2回目以降:5.0~5.1秒前後 ・AOTコンパイル 初回実行:8.1~8.2秒前後、2回目以降: 8.1~8.2秒前後 https://a5m2.mmatsubara.com
  9. 9. なんで? Windows Subsystem for Linuxのせい? …でもないらしい。 そもそも、JITコンパイルは「実行時の情報を利用できる」から、 高速に動くという能書きだったはず。 https://a5m2.mmatsubara.com CPU中心の処理はパフォーマンス低下はほとんどない。 ファイル操作はまだ苦手みたい。 プロセス生成が遅いという話も。
  10. 10. なんで?…その2 そもそもJITコンパイルは次の5つの段階がある。 一般的にレベルは 0→3→4と変化するらしい。 レベル2とレベル4じゃAOTコンパイル勝てない…。 レベル (Tier) コンパイラ 動作モード 0 インタプリタ 1 C1 クライアントレベル プロファイリングなし 2 基本的なプロファイリング使用 3 全てのプロファイリング使用 4 C2 サーバーレベル AOTコンパイル 方式はレベル2 相当らしい。 https://a5m2.mmatsubara.com AOTコンパイル はレベル2相当 JITコンパイルは 最終的にレベル 4になる
  11. 11. でももうちょっと何とか… デフォルトでは、AOTコンパイルしたらJITコンパイラは働かない モードらしい。オプション指定でJITコンパイラも併用できる。 ■AOTコンパイルのオプションを変える $ jaotc --compile-for-tiered --output ../mmsort.so mmsort/*.class 段階的なコンパイル…つまりJITコ ンパイルを併用するオプション https://a5m2.mmatsubara.com
  12. 12. 何とかした結果 ・AOTなし(JITコンパイル) 初回実行:7.6秒前後、2回目以降:5.0~5.1秒前後 ・AOTコンパイル(--compile-for-tieredつき) 初回実行:7.3秒前後、2回目以降: 5.0~5.1秒前後 初回実行がちょっとだけ速くなった。2回目 以降はJITコンパイラ並み!!。 https://a5m2.mmatsubara.com
  13. 13. まとめ…というか感想 ・AOTコンパイルはJITコンパイルより遅い。 ・…というか、JITコンパイルは優秀。 ・AOTコンパイル使いどころ難しい…効果もそれほど…。 ・まだ出たばかりの機能、サポートもない。これからいろいろ改 善されてくはず。 ・Windows のAOT対応はJava 10かららしい。 ・Windows Subsystem for Linux結構使える。 https://a5m2.mmatsubara.com
  14. 14. Copyright © 2017 松原正和 ご清聴ありがとうございました。 https://a5m2.mmatsubara.com

×