5

JMHを使用して操作の複雑さを指定します。JMH を使ったことがなくても心配はいりません。JMH はestimateOperationメソッドを複数回起動し、平均時間を取得します。

質問: [narrow]このプログラムはMath.cbrt(Integer.MAX_VALUE)毎回計算しますか? それとも、一度計算して、後でキャッシュされた結果を返すだけですか?

@GenerateMicroBenchmark
public  void estimateOperation() {
    calculate();
}

public int calculate() {
    return Math.cbrt(Integer.MAX_VALUE);
}

質問: [広義]: JVM はメソッドの結果をキャッシュしますか?

4

4 に答える 4

9

メソッドの戻り値は決してキャッシュされません。ただし、不必要な呼び出しは、定数の折りたたみ定数の伝播デッド コードの削除ループ不変ホイストメソッドのインライン化などの特定の最適化により、実行時に JIT コンパイラによって削除される場合があります。

たとえば、または で置き換えMath.cbrtた場合、メソッドは JIT コンパイル後にまったく呼び出されません。これは、呼び出しが定数に置き換えられるためです。(最適化は では機能しません。これはまれな方法であり、JVM によって組み込まれていないネイティブ呼び出しに該当するためです)。Math.sqrtMath.powcbrt

于 2014-06-15T20:48:25.560 に答える
2

いいえ。

簡単に言えば、メソッドは毎回異なる値を返す可能性があるため、Java はメソッドの結果をキャッシュしません。

于 2014-06-15T20:18:14.193 に答える
2

はい、呼び出されるたびにそのコードを呼び出します

public int calculate() {
    return Math.cbrt(Integer.MAX_VALUE);
}


public double calculate();
    Code:
       0: ldc2_w        #3                  // double 2.147483647E9d
       3: invokestatic  #5                  // Method java/lang/Math.cbrt:(D)D
       6: dreturn    

キャッシュを取得するには、単にそのマジック ナンバーを次のように置き換えます。

プライベート静的最終フィールド

private static final double NUMBER = Math.cbrt(Integer.MAX_VALUE);
于 2014-06-15T20:23:05.220 に答える
2

狭い質問への回答: JVM の実装とコードの解釈方法によって異なります。

一般的な質問への回答: いいえ、Anubian も指摘したように、メソッドは呼び出しごとに異なる値を返す可能性があるためです。

于 2014-06-15T20:56:26.167 に答える