Date: Mon, 29 Nov 99 19:17:54 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:29232] effect of adaptive compilation (Re: HotSpot 1.0.1 EA --- On Stack Replacement! & JDC99Tokyo Topic) To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199911291019.TAA29952@cafe.muraoka.info.waseda.ac.jp> 首藤です。 > 昨日 (99年 7/15(金))、東京工業大学で次の講演がありました。 > Lars bak による、HotSpot に関する講演 > (タイトルは忘れました。) > - 各メソッドは呼び出しカウンタ (invocation counter) を持つ。 > カウンタの値がある敷居値 (*1) を超えると JIT コンパイルが > 起こるのでしょうね。 このような呼出しカウンタを用いた、簡単な adaptive compilation で、 どれだけの JIT コンパイルをサボれるのか、調べました。 メソッドを、何回呼び出された時点で JIT コンパイルするか、 というしきい値を変えてみて、結果的にいくつのメソッドがコンパイルされたか、 という対応表が以下です。 テストプログラムは、末尾に添付しますような簡単なアプレットです。 JDK 1.1.7 (Linux) の appletviewer を用いました。 1, 696 2, 474 3, 390 4, 327 5, 279 6, 267 7, 249 8, 236 9, 220 10, 213 11, 200 12, 188 13, 182 14, 167 15, 152 16, 147 17, 141 18, 135 19, 124 20, 120 21, 118 22, 117 23, 109 24, 106 25, 104 26, 98 27, 96 28, 91 29, 85 30, 83 31, 82 32, 81 33, 81 34, 81 35, 80 36, 77 37, 77 38, 77 39, 77 40, 75 41, 72 42, 72 43, 72 44, 72 45, 71 46, 71 47, 71 48, 70 49, 68 メソッドを実行前に必ず JIT コンパイルする場合、 696 のメソッドがコンパイルされます。 10回目の呼び出しで初めて JIT コンパイルする場合、 213 のメソッドがコンパイルされます。 こういった単純な手法で、ずいぶんと コンパイル対象を減らせることがわかります。 これ、実はかなり前に調べていたのですが、 [JavaHouse-Brewers:29156] から始まる 『Navigator は JVM 起動時に長時間固まってしまって悲しい』 というスレッドを見ていまして思い出しました。 [JavaHouse-Brewers:29207] にて高木さん wrote:: > 「VMが起動するまでどのJavaのプログラムも実行を開始できない」のは当然 > ですが、ブラウザの他の機能、HTMLの続きのロードとレイアウトや、メニュー > などのイベントの処理はできるはずです。 その通りだと思います。 JVM の処理とブラウザの他の処理 (UI の扱い, HTML のレイアウト, ...) の 並行 (並列) 処理を、Navigator や Mozilla に強く望みます。 (もしこれから実装されたとしても、遅過ぎですね...) 同時に、上記のような簡単な方法で、JIT コンパイルを ずいぶんとさぼれるわけです。 もちろん、上記の実験結果は、そのまま Navigator には当てはめられません。 appletviewer では HTML の扱いも Java のコードで処理されるためです。 しかし、そんなに悪くない近似にはなっていると思います。 …それ以前に、Navigator のあの長い JVM 起動時間、 マシンは何をしているのかを調べないといけないわけですが。 現実逃避中 (T_T) の SHUDO Kazuyuki/首藤一幸 shudoh at muraoka.info.waseda.ac.jp 実験に使ったアプレット: ========== import java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { public void init() { resize(150, 30); } public void paint(Graphics g) { g.drawString("Hello world.", 50, 25); System.exit(0); } }