14

したがって、私の質問はより一般的です。私は次の簡単なコードを持っています:

for(int i=0;i<10;i++){
    long starttime=System.nanoTime();
    System.out.println("test");
    long runtime=System.nanoTime()-starttime;
    System.out.println(i + ":" +"runtime="+runtime);
}

次の出力を受け取ります。

test
0:runtime=153956
test
1:runtime=15396
test
2:runtime=22860
test
3:runtime=11197
test
4:runtime=11197
test
5:runtime=12129
test
6:runtime=11663
test
7:runtime=11664
test
8:runtime=53185
test
9:runtime=12130

最初のランタイムと 2 番目のランタイムの違いの理由は何ですか?よろしくお願いします =)

4

3 に答える 3

21

JVM と標準ライブラリの両方で、JVM の起動時間を改善するために多くのものが遅延初期化されます。したがって、最初に行を実行するとき

System.out.println("test");

重い初期化プロセスが発生します。完了するまでの時間は、最初の測定に含まれています。後続の呼び出しは、状態が既に初期化されている高速パスを進みます。

Java の非常に多くの API 呼び出しで同じ効果が見られます。

当然のことながら、特定のメソッド呼び出しを完了するのにかかる時間に影響を与える要因は他にもたくさんあります。特に、パスにシステム呼び出しが含まれている場合はそうです。ただし、最初の呼び出しの待機時間の外れ値は、その根底に決定論的な原因があり、したがって確実に再現できるという点で特別です。

于 2015-08-06T14:28:51.127 に答える
17

多くのことが計算に影響を与える可能性があります。

マシン上の他のプロセスはどうですか? JVM のウォームアップを検討しましたか? 多分ガベージコレクション?これらすべての要因とその他の要因が、この動作につながります。

「より良い」結果を得たい場合は、より多くの回数実行し、平均を取る必要があります。

そのため、Java で物事をベンチマークする方法を知っておく必要があります。Java で正しいマイクロベンチマークを作成するにはどうすればよいですか? を参照してください。.

于 2015-08-06T14:29:32.300 に答える