マイクロベンチマークでのデッド コードの排除を回避するための最も一般的な解決策は次のとおりです。
- 計算結果を返す
- ブラックホールを使用して結果を消費します。
私の質問は:
計算の結果をパブリック変数に入れることで、デッド コードの削除を回避することは可能でしょうか?
編集:
Shipilev の回答のおかげで、JMH の例で説明されているように、結果を返すか、ブラックホールを使用してそれらを消費することは、デッド コード消去 (DCE) を回避するために適切に行う必要があることに気付きました。
したがって、明確にするために質問を書き直します。
計算の結果を返すか、blackwholesで消費するだけで DCE を回避できる場合は、結果をパブリック変数に配置するだけで十分ですか?
次のように、サンプルJMHSample_08_DeadCodeのバリエーションを実行しました。
public double sink;
@Benchmark
public void measureRightPerhaps_2() {
// What could possibly go wrong?
sink = Math.log(x);
}
そして、結果からそう思われます:
Benchmark Mode Cnt Score Error Units
baseline avgt 15 0,458 � 0,001 ns/op
measureRight avgt 15 33,233 � 0,268 ns/op
measureRightPerhaps_2 avgt 15 30,177 � 0,603 ns/op
measureWrong avgt 15 0,459 � 0,001 ns/op
measureWrong_2 avgt 15 0,917 � 0,001 ns/op