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