2

マイクロベンチマークでのデッド コードの排除を回避するための最も一般的な解決策は次のとおりです。

  1. 計算結果を返す
  2. ブラックホールを使用して結果を消費します。

私の質問は:

計算の結果をパブリック変数に入れることで、デッド コードの削除を回避することは可能でしょうか?

編集:

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
4

1 に答える 1