3

次のコードでは:

long startingTime = System.nanoTime();
int max = (int) Math.pow(2, 19);
for(int i = 0; i < max; ){
    i++;
}
long timePass = System.nanoTime() - startingTime;
System.out.println("Time pass " + timePass / 1000000F);

自分のマシンで簡単なアクションを実行するのにかかる時間を計算しようとしています。

19の累乗までのすべての計算により、このコードの実行にかかる時間が長くなりますが、19を超えると(最大int値31まで)、所要時間に影響がないことに驚きました。私のマシンでは常に5ミリ秒と表示されます!!!

どうすればいいの?

4

3 に答える 3

12

HotSpotがループ全体を忘却に最適化するのを目撃しました。スマートです。ループ内で実際のアクションを実行する必要があります。intアキュムレータ変数を導入してビット単位の演算を実行し、最後に結果を出力して、ループ後に必要になることを確認することをお勧めます。

于 2012-07-09T07:59:43.773 に答える
2

HotSpot JVMでは-XX:CompileThreshold=10000、デフォルトで。これは、10K回繰り返すループが、メソッド全体を最適化するようにトリガーできることを意味します。あなたの場合、あなたはあなたのメソッドを(バックグラウンドで)検出してコンパイルするのにかかる時間を計っています。

于 2012-07-09T08:31:37.233 に答える
0

ループで別のSystem.nanoTime()を使用します。誰もこれを最適化することはできません。

for(int i = 0; i < max; ){
i++;
dummy+=System.nanoTime();
}

することを忘れないでください:

System.out.println(dummy);

ループの後。非最適化を保証します

于 2012-07-09T08:47:49.427 に答える