17

System.currentTimeMillis()は、Javaの時間パフォーマンスの最良の尺度ですか?これを使用して、アクションが実行される前の時間とアクションが実行された後の時間を比較する場合の落とし穴はありますか?より良い代替案はありますか?

4

6 に答える 6

13

私はそうしないことを望みます-それは私が使用しないときに私が使用するものnanoTime()です。

于 2009-07-02T09:16:09.373 に答える
2

Google Guava のストップウォッチを使用すると、時間の測定が非常に簡単になります。

于 2014-04-10T07:47:55.310 に答える
2

それに加えてSystem.nanoTime()、JMX はおそらく実行可能な最良のオプションです。

java.lang.management.ManagementFactory.getThreadMXBean()

現在のスレッドのCPU時間を照会できます(ナノ秒単位で測定されますが、()のようにナノ秒の精度ではありませんSystem.nanoTime

于 2009-07-02T09:20:47.040 に答える
1

If you need monotonic time measurements, System.nanoTime is a better choice. System.currentTimeMillis is subject to UTC timing variations -- leap seconds, NTP updates and jitter, as well as users setting the system clock*. This can cause some spectacular failures in certain kinds of timing applications. System.nanoTime is supposed to be immune to all that.

The problems with System.nanoTime include periodic numeric overflow and long term timing inaccuracy, making System.currentTimeMillis better for longer time spans (provided that users leave the system clock alone). Note that daylight saving time and time zone changes should not affect System.currentTimeMillis.

*Windows "Sync with internet time" makes stepwise changes. This can be very disruptive, as opposed to a proper NTP client implementation that "chases" the server by adjusting the client timebase frequency.

于 2011-11-13T21:14:26.270 に答える
0

Java 1.5より前は、System.currentTimeMillisしかありませんでした。ただし、値の粒度は基盤となるオペレーティングシステムによって異なり、大きくなる可能性があります。Windows XPでは、20ミリ秒のギャップが発生することがありました。Linuxの方が、ギャップが1〜2ミリ秒の範囲ではるかに優れていると聞きました。

Java 1.5では、System.nanoTimeを使用することもできます。私はこれで問題があったことはありません。

于 2009-07-02T09:17:08.870 に答える
-1

1 つの落とし穴は、これが CPU 時間ではなくリアルタイムの経過時間を測定することです。そのため、システム負荷に大きく依存します。これは、それ以外の場合は無料のマシン上であれば問題ありませんが、他のプロセスが作業を行おうとしている場合、興味深い結果が得られることがあります。

この記事には、この問題に対する興味深い解決策があります。

于 2009-07-02T09:19:41.207 に答える