65

今日は、 と の速度パフォーマンスをテストするために少し簡単なベンチマークをSystem.nanoTime()行いましたSystem.currentTimeMillis()

long startTime = System.nanoTime();

for(int i = 0; i < 1000000; i++) {
  long test = System.nanoTime();
}

long endTime = System.nanoTime();

System.out.println("Total time: "+(endTime-startTime));

結果は次のとおりです。

System.currentTimeMillis(): average of 12.7836022 / function call
System.nanoTime():          average of 34.6395674 / function call

走る速度の差がこんなにも大きいのはなぜですか?

ベンチマーク システム:

Java 1.7.0_25
Windows 8 64-bit
CPU: AMD FX-6100
4

5 に答える 5

24

ほとんどのOS(使用しているOSについては言及していません)には、ミリ秒の精度(またはそれに近い)を提供するメモリ内カウンター/クロックがあります。ナノ秒の精度を得るには、ほとんどの場合、ハードウェア カウンターを読み取る必要があります。ハードウェアとの通信は、既にメモリにある値を読み取るよりも遅くなります。

于 2013-09-27T13:47:30.567 に答える
1

あなたはWindowsでそれを測定していますよね。私は 2008 年にこの演習を行いました。Windows では、nanoTime は currentTimeMillis よりも低速です。私が思い出したように、Linux では、nanotime は currentTimeMillis よりも高速であり、Windows よりも確実に高速です。

注意すべき重要なことは、複数のミリ秒未満の操作の集計を測定しようとしている場合、操作がコードの 1/1000 秒未満で終了したかのように nanotime を使用する必要があることです。 currentTimeMillis を比較すると、操作が瞬時として表示されます。したがって、これらの 1,000 はまだ瞬間的です。nanotime を使用してから最も近いミリ秒に丸めることができます。そのため、操作に 8000 ナノ秒かかった場合、0 ではなく 1 ミリ秒としてカウントされます。

于 2014-02-06T14:45:24.770 に答える
0

nanotime を使用してから最も近いミリ秒に丸めることができます。そのため、操作に 8000 ナノ秒かかった場合、0 ではなく 1 ミリ秒としてカウントされます。

算術注:

8000 ナノ秒は 8 マイクロ秒、0.008 ミリ秒です。丸めはそれを 0 ミリ秒にします。

于 2015-08-15T22:50:23.350 に答える