コードサイズによっては、JVMが「ウォームアップ」するのに時間がかかることを知っています。私の質問は次のとおりです。プログラマーがコードの可能なセクションを調べて、「ウォームアップ」プロセスをスピードアップするのに役立つ方法はありますか?
3 に答える
コードを何度も呼び出すことで、間接的に行うことができます。デフォルト-xx:CompileThreshold=
は 10000 です。したがって、重要なコードを何回も呼び出すことができます (例: 12,000 回)。
コンパイルのしきい値を下げることはできますが、ループが 10000 ではなく 1000 になる可能性があるというだけで、同じ問題が残ります。
コードをウォームアップする理由の 1 つはコードを最適化することですが、反復回数を短くすると、一部の最適化が実行されず、最適化されていない呼び出しが発生する可能性があります (常にではありません)。
次に、コードをウォームアップする方法が代表的ではない場合、最適化されていない方法でコードを最適化することができ、JVM は後でコードを再最適化することを決定する可能性があります。
アプリのビルド時にクラスのセットをネイティブコードにコンパイルし、仮想マシンでランタイムロードされたクラスのみを実行できるgcjなどの事前コンパイラーを検討することをお勧めします。コンパイルが終了した後のパフォーマンスはそれほど良くありませんが(特に実行時にロードされるコードに多くの時間を費やす場合)、実行時間が短いプログラムの場合、これを相殺する以上に事前コンパイルの利点があります。
javaでのマイクロパフォーマンス測定に関するdeveloperWorksに関する本当に良い記事があります。また、「ウォームアップ」やその他の関連事項についても説明します。著者は、Javaでのマイクロベンチマークのための非常に優れたフレームワークを実装しました。このフレームワークは、JVMのウォームアップフェーズも処理し、実際のテストが開始される前に、JVMを高速化して終了しようとします。フレームワークのソースコードも利用できるので、これがどのように実装されているかを見ることができます。