18

問題:8000バイトを超えるJavaバイトコードにコンパイルするメソッドがあります。HotSpotには、8000バイトを超えるメソッドに対してJITが起動しないようにする魔法の制限があります。(はい、巨大なメソッドを持つことは合理的です。これはトークナイザーループです。)メソッドはライブラリ内にあり、ライブラリのユーザーが魔法の制限を無効にするようにHotSpotを構成する必要はありません。

観察:バイトコードを逆コンパイルすると、EclipseJavaコンパイラが多くの無意味なgotoを生成することがわかります。(javacはさらに悪いです。)つまり、ジャンプからのみ到達可能なgotoがあります。明らかに、後藤にジャンプするジャンプは、代わりに後藤がジャンプする場所に直接ジャンプする必要があり、後藤は削除する必要があります。

質問:無意味なジャンプチェーンをフラット化して不要なgotoを削除するJava 5クラスファイル用のバイトコードオプティマイザーはありますか?

編集:私は次のようなパターンを意味します:

8698:   goto    8548
8701:   goto    0

明らかに、2番目のgotoに到達するには、8701にジャンプする必要があります。これは、0に直接ジャンプする場合もあります。

2回目の調査では、この疑わしいパターンがより一般的です。

4257:   if_icmpne   4263
4260:   goto    8704
4263:   aload_0

明らかに、コンパイラーが「等しくない」比較を「等しい」比較に逆にし、8704にジャンプして、gotoを削除するようにしたい場合。

4

7 に答える 7

1

あなたの痛みが分かります。約 5kloc の if(str.equals(...)) コードを持つパーサーを一度作成する必要がありました。parse1、parse2 などの行に沿っていくつかのメソッドに分割しました。parse1 が解析された回答にならなかった場合、parse2 が呼び出されました。これは必ずしもベスト プラクティスではありませんが、必要なことは実行します。 .

于 2009-06-03T12:55:11.607 に答える
0

それがトークナイザーループである場合、データ駆動型のマッピングのセットと必要に応じて少しのリフレクションを使用してそれを行う方が良いでしょうか?

したがって、トークンの一致を、そのトークンの構文および関連する関数を実装するメソッドに関するデータにマップする構造に格納します。ルックアップは構造全体で最適化でき、大きなループを回避できます。

これにより、データと実装の同期を維持するという問題が発生しますが、ドックレットまたは場合によってはアノテーションを使用してコードベースからデータを生成できます。

あなたの大きな方法が何をするのかを正確に知らなくても、私たちはあなたが想定している方法でそれを最適化しようとすることに制限されています(そしてそれはとにかく不可能であるようです)。

于 2009-06-03T14:34:12.733 に答える
0

クラスでバイトコード圧縮/難読化を実行すると、パフォーマンスが向上しますか? 例: yguard、proguard、...

ユースケースが非常に特殊であるため、asmを使用してクラスファイルポストプロセッサを作成できる場合があります。

無意味なゴトを全部取り除いても魔力限界以下になるの?

于 2009-06-30T12:29:46.290 に答える
0

デバッグ シンボル (つまり、javac の -g フラグ) を使用してコンパイルしない場合、違いはありますか? これにより、メソッドが魔法の限界を下回る可能性があります。

于 2009-06-03T12:57:13.243 に答える
0

バイトコード ライブラリのリストには、以前に聞いたことがある BCEL と ASM が記載されており、他の多くのライブラリがさまざまなことを行っています

于 2009-06-30T12:48:19.217 に答える
0

1 つのメソッドが 8000 バイト以上にコンパイルされますか? 誰かがそのコードを理解していますか? テスト可能ですか?オプティマイザーを煩わすのではなく、意味のある名前を持つ複数の (プライベート?) メソッドに分割してみてください!

OK、おそらく正当な大規模なメソッドの場合があります。しかし、申し訳ありませんが、質問にはヒントがありません。

于 2009-06-03T12:49:50.527 に答える
0

メソッドをサブメソッドにリファクタリングすることは不可能でしょうか? とにかく、最新のJITはこれらの呼び出しをインライン化します。

于 2009-06-03T13:06:47.480 に答える