0

重複の可能性:
Java: 空のループの使用時間は?

以下を見てください。

for (int j = 0 ; j < 5 ; j++) {     
    long t1 = System.currentTimeMillis();
    for (int i = 0 ; i < 10000000 ; i++)
        ; // intentionally empty
    long t2 = System.currentTimeMillis();
    System.out.println (t2 - t1);
}

出力 (可能な多くの 1 つ):

2
11
0
0
0

このプログラムを複数回実行すると、出力の最初の 2 つの数値は常にゼロではなく、他のすべての数値は実際に 0 であることがわかります。さらに、通常、2 番目の数値は最初の数値よりも大きいように見えます。これは、より高くループしても保持されるように見えますj < 100これには具体的な理由はありますか?もちろん、ミリ秒はおそらく一般的に大きな違いはありませんが、私はただ興味があります.

4

3 に答える 3

1

2 番目のループは空であり、最適化して取り除くことができます。JVM はこの事実を認識するのに時間がかかるため、最初から完了していません。たぶん、最適化にかかる時間は 2 回目の実行に費やされます。

于 2012-10-05T03:17:29.140 に答える
1

これはあなたが求めている結果をもたらしますか?

long t1 = System.currentTimeMillis();
for (int j = 0 ; j < 5 ; j++) {     
        for (int i = 0 ; i < 10000000 ; i++){}
        long t2 = System.currentTimeMillis();
        System.out.println(t2 - t1);
    }
于 2012-10-05T03:18:25.047 に答える
1

HotSpot JIT は、いくつかの最適化ループを実行します。最初に、コードを半最適化されたマシン バージョンにコンパイルするか、解釈するだけです。次に、2 番目のループが実際にはホットスポットであることを確認し、より積極的な最適化でコードを再コンパイルします。コンパイル プロセスは、おそらくパフォーマンスの 2 番目のピークです。次に、何もしない最適化されたバージョンを実行するため、すべてゼロになります。コードを実行すると-server、コードが以前にコンパイルされる可能性があり、異なる結果が得られます。で実行して-Xint、各ループ反復で均一なパフォーマンスを確認します。

于 2012-10-05T03:24:52.300 に答える