VM引数を変更しながら、マイクロベンチマークを取りたいケースってあると思うのですが、
JITコンパイラに影響のある引数の場合、ただプログラムを実行して時間を計測するのみでは
うまくその影響を測れません。なぜなら、プログラムの実行中にVMが判断したタイミングでJITコンパイラが走りコードが最適化されるので、どの程度そのVM引数の変更の効果があったのか測れないからです。
JMH の利用
このようなケースでは、ベンチマークツールである JMH を使用するのが便利です。
JMH の使用方法についてはこちらのの記事で説明されていますので、以降では、JMHでのベンチマークの際にVM引数を指定する方法を説明します。
VM引数の指定方法
以下のようにベンチマークを行うメソッドにForkアノテーションを付与し、JvmArgsAppend属性を利用することによってVM引数を指定することができます。
この例では、「-XX:-Inline」を指定ています。
@Benchmark
@Fork(jvmArgsAppend = "-XX:-Inline") // アノテーションでVM引数を指定する
public String インライン展開なし() {
return execute();
}
また、以下のように実装することによって、VM引数の有り無しを同時にベンチマークすることができます。
@Benchmark
public String インライン展開あり() {
return execute();
}
@Benchmark
@Fork(jvmArgsAppend = "-XX:-Inline") // アノテーションでVM引数を指定する
public String インライン展開なし() {
return execute();
}