私は、それSystem.nanoTime()
が現在、時間を測定するための好ましい方法であることを知っていSystem.currentTimeInMillis()
ます. 最初の明らかな理由は、nanoTime() がより正確なタイミングを提供することであり、もう 1 つの理由は、後者がシステムのリアルタイム クロックの調整の影響を受けることです。「システムのリアルタイム クロックの影響を受ける」とはどういう意味ですか?
3 に答える
この場合、次のブログ投稿の抜粋が役立つことがわかりました。
絶対時間の測定に関心がある場合は、常に を使用して
System.currentTimeMillis()
ください。その解像度は非常に粗い場合があることに注意してください (これが絶対時間の問題になることはめったにありません)。経過時間の測定/計算に関心がある場合は、常に を使用して
System.nanoTime()
ください。ほとんどのシステムでは、マイクロ秒単位の解像度が得られます。ただし、一部のプラットフォームでは、この呼び出しの実行にマイクロ秒かかる場合があることに注意してください。
クロックとタイマー - David Holmes による概要
はシステムの時刻System.currentTimeMillis()
時計に依存しているため、時刻を正確に保つために時刻を調整することは正当です。
ここでの調整とはどういう意味ですか? たとえば、CLOCK_REALTIME
from Linuxの説明を見てください。
実時間 (壁時計) を計測するシステム全体の時計。このクロックを設定するには、適切な権限が必要です。このクロックは 、システム時間の不連続なジャンプ(たとえば、システム管理者が手動でクロックを変更した場合) と、adjtime(3) および NTP によって実行される増分調整の影響を受けます。
メソッドのJavaDocを確認してください:
System.nanoTime()
「...この方法は、経過時間を測定するためにのみ使用でき、システムまたは壁時計時間の他の概念とは関係ありません....」
System.currentTimeMillis()
「...現在の時間をミリ秒単位で返します。...」
を使用した測定中にシステム時間が変化するかどうかを確認できるように、測定System.currentTimeMillis()
する間隔も変化します。System.nanoTime()
ただし、メソッドを使用して間隔を測定する場合は変わりません。
返される値System.currentTimeMillis()
は、マシンの内部クロックから取得されることを意味します。システム管理者 (または NTP) が時刻を変更した場合 (たとえば、クロックが 5 分速く動いていることが判明し、システム管理者が行って修正した場合)System.currentTimeMillis()
は影響を受けます。これは、値の減少も見られることを意味し、それを使用して間隔を測定すると、タイミングがずれることがあります。負のタイミングを測定することさえできます。
System.nanoTime()
一方、一部の内部 CPU カウンター/クロックから派生した値を返します。このクロックによって計測される時間は、ユーザーまたはプログラムによって変更することはできません。これは、タイミングの信頼性が高くなることを意味します。ただし、CPU クロックは電源オフ時にリセットされるため、現在の「ウォールクロック」時間を見つけるのには役立ちません。