15

JMH ベンチマーク フレームワーク ( http://openjdk.java.net/projects/code-tools/jmh/ ) を使用して、コードのベンチマークを実行しています。私の理解では、JMH は、実行中に JVM によって実行されるジャストインタイム (JIT) プロファイリングによって構築されたプロファイルを破棄するために、ベンチマーク中に JVM を複数回フォークします。

これが以下のような場合に役立つ理由を理解しています ( http://java-performance.info/jmh/から逐語的にコピー):

デフォルトでは、JHM は各トライアル (反復のセット) ごとに新しい Java プロセスをフォークします。これは、以前に収集された「プロファイル」 (ロードされた他のクラスとその実行情報に関する情報) からテストを防御するために必要です。たとえば、同じインターフェースを実装する 2 つのクラスがあり、両方のパフォーマンスをテストする場合、最初の実装 (テスト順) は、2 番目の実装 (同じ JVM 内) よりも高速になる可能性があります。 2 番目の実装を検出した後、インターフェイス メソッド呼び出しを使用して最初の実装に直接メソッド呼び出しを行います。

ただし、同じコードを繰り返しベンチマークしている場合、200 回の反復で 1 つのフォークを実行する代わりに、それぞれ 20 回の反復で 10 のフォークを実行することに利点はありますか?

どうもありがとう、

ダニー

4

1 に答える 1

14

フォークを使用することで解決される別の問題は、実行ごとの差異であると主張する人もいます: http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/ org/openjdk/jmh/samples/JMHSample_13_RunToRun.java

ただし、真面目なエンジニアであれば、ベンチマーク環境を十分に制御して、実行間の違いをなくすことができなければなりません。フォークを使って自分の怠惰や、ベンチマークが実際にどのように実行されるかを理解していないことを克服しようとしている人を見ると、がっかりします。

于 2014-09-01T13:48:46.800 に答える