マイクロベンチマークを作成する場合、メソッドがコンパイルされているかどうかによって、実行時間に大きな違いが見られます。プログラム内から特定のメソッドがコンパイルされているかどうかを確認する方法はありますか?あるいは、それを要求する方法、またはJVMに渡されるフラグなどに関する追加情報なしで適切にウォームアップする方法を知る方法はありますか?明らかに、これは必ずしも完全ではありません(たとえば、JVMが解釈されたコードにフォールバックする原因となる条件が存在する可能性があります)が、確かに改善されます。
2 に答える
Sun / Oracle JVMの場合、この-XX:CompileThreshold=1000
設定を使用できます。
これは、公式ドキュメントに記載されているように、次のように定義されています。
コンパイル前のメソッド呼び出し/ブランチの数
次に、番号を使用してJVMを「ウォームアップ」します。
メソッドがコンパイルされたときに(コンソールで)通知を受けるために、-XX:-PrintCompilation
と一緒に使用することもできます。-XX:CompileThreshold
メソッドがJITCされたときに表示されるロギングをオンにできると確信しています。しかし、私はJava内からそれを伝える方法を知りません。
また、JITコンパイルはイベントではなくプロセスであることに注意してください。メソッドの特性に関する詳細情報が利用可能になると、メソッドは数回再コンパイルされる可能性があります。
最後に、「ウォーミングアップ」は一般的なケースでは不適切であることに注意してください。通常、単一のメソッドを確実に「ウォームアップ」することはできますが、いくつかの要因により、適度に大規模なアプリケーションでもはるかに困難です。
(メソッドのある種のJITCステータスを読み取る機能を組み込みデバッグツールに追加できなかった理由はわかりませんが。)
追加:コード「スニペット」のベンチマークを行う場合、注意すべき点の1つは、すべてのループを実行する最も外側のメソッドは、返されないという事実のために、多くの場合JITCに対応していないことです(JITCの実装方法によって異なります)。したがって、JITCedバージョンを呼び出すことはできません。したがって、ベンチマークするコードの「肉」を、繰り返し呼び出される別のメソッドに配置する必要があります。ループとベンチマーク対象のコードを同じメソッドに配置するのではありません。