4

JIT は 10k の呼び出し後にメソッドの最適化 (-XX:+PrintCompilation) を行い、-XX:CompileThreshold で構成できます。そのしきい値を下げない理由は、JIT 最適化が間違っているか、使用頻度の低いコードを最適化している可能性があるためだと読みました。この分野に関していくつか質問があります。

  1. 間違った最適化 (つまり、on-stack-replacement) は、ポリモーフィック メソッドの遅延クラスローディングによるものだと思います。しかし、3 つの実装 (と思います) が見つかった後、JVM は単にインデックス テーブルのルックアップを行います。もちろん、ポリモーフィックな impl が多ければ速度は低下します。ポリモーフィック メソッドは、間違った JIT 最適化の唯一の原因または主な原因ですか? そうでない場合、他の人は何ですか?
  2. JVM がそのようなインデックス テーブルを前もって構築できるように、起動時にすべてのクラスを強制的にロードできるとしたら、前もって全体的な最適化を行う方がよいのではないでしょうか? すべてを最適化するアプローチの何が問題になっていますか? 私の目標が速度だけである場合、コストはいくらですか?
  3. C++ と比較して、私のソースが閉じている場合、つまりサードパーティのライブラリがないことを意味し、その低遅延システムのように、事前に最適化を強制してパフォーマンスを向上させ、C++ のパフォーマンスに近づける方法はありますか?
  4. Peter Lawrey は、彼のオラクル マガジンの記事で、しきい値を満たすのに十分な量のテスト データを本番環境で人為的に実行することで、JIT を開始できると述べています。そうすることは、本番環境では危険に思われ、1つの事故で解雇されます。最小限のリスクでそれを行うためのより良い方法が必要です。
  5. このトピックに関する参考文献 (Java と C++ を含む) は大歓迎です。

更新: #3。Java が C++ よりも速いと期待するべきではありません。

4

1 に答える 1

2

事前に最適化を強制して、C ++よりもパフォーマンスを向上させる方法はありますか?

いいえ。これは、Java仕様で適用されるセマンティクスの基本的な制限であり、JVMエコシステムの動作方法では、実装とコードの品質が同等であると仮定すると、C++実装よりも遅くなります。詳細については、このテーマに関する私の既存の回答をご覧ください。

于 2012-06-04T17:32:16.297 に答える