23

そんなこと知ってるSystem.nanoTime()時間を測定するための現在好ましい方法はありますSystem.currentTimeInMillis()。最初の明白な理由はnanoTime()がより正確なタイミングを与えること、そして後者がシステムのリアルタイムクロックの調整の影響を受けるというもう一つの理由です。 「システムのリアルタイムクロックの影響を受ける」とはどういう意味ですか?


  • 私も興味があります。あなたが使用しようとした場合どうなりますかcurrentTimeInMillis()夏時間のシフト中に経過時間を記録するには?それともそれが意味するものではありませんか? - trevor-e
  • currentTimeMillis測定しようとすると、物理現象としての時間の流れです。 DSTシフトは、旅行中のタイムゾーンの変更に似ています。時間の表示方法にのみ影響します。時間自体は影響を受けません。 - Joni
  • currentTimeMillisの影響を受けていません。 DST、しかしそれは影響を受けます。うるう秒などnanoTime。 - Louis Wasserman
  • platzhirsch's answer"で言及されているブログの@LouisWassermanは、絶対時間に関連するイベントは絶対時間の変化(例:夏時間の開始/終了)を認識する必要があるため、相対的な時間は変更する必要があるため問題です。そのような変化に免疫があるようにしなさい。常にこれは、ほとんどのオペレーティングシステムに問題があることを意味します(いずれかの方法で)。 "それ以来currentTimeInMillis「時刻」を使用します。それとも絶対クロックですが、currentTimeInMillisがDSTの影響を受けているとは限りませんか。 - Geek
  • @JoniSalonenルイへの私のコメントをご覧ください。あなたはどう考えていますか? - Geek

3 답변


25

この場合、私は以下のブログ記事の抜粋が有用であることがわかりました。

興味のある方絶対時間を測定するそれからいつも使うSystem.currentTimeMillis()。その解像度はかなり高いかもしれないことに注意してください   粗い(ただし、これが絶対的な問題であることはめったにありません。)

興味のある方経過時間の測定/計算それから   いつも使うSystem.nanoTime()。ほとんどのシステムでは、   マイクロ秒のオーダーの解像度。ただし、注意してください、この呼び出し   プラットフォームによっては実行にマイクロ秒かかることもあります。

クロックとタイマー - 一般的な概要David Holmes著

からSystem.currentTimeMillis()システムに依存している時刻時計、時間の調整は時間通りに保つために合法的です。

ここで調整とはどういう意味ですか?例えばの記述を見てみましょうCLOCK_REALTIMELinuxから:

実時間(すなわち、実時間)を測定するシステム全体の時計。                 この時計を設定するには適切な特権が必要です。この時計はシステム時間の不連続ジャンプの影響(例:もし                 システム管理者が手動で時計を変更する)によって、                 adjtime(3)とNTPによって実行される増分調整。


  • これは、指定したリンクからのものです。「相対時間時計は、「フリーランニング」を返すSystem.nanoTime()メソッドで表されます。ナノ秒単位の時間。 "なぜ「フリーランニング」と呼ばれるのですか。時間? - Geek
  • @Geek私は自由のことを言っています独立した。絶対時間は、オペレーティングシステムによってトリガーされた割り込みによって異なります。親戚フリーランニングJoni Salonenが指摘したように、時間は内部のCPUクロックタイマーから派生したものです。 - Konrad Reiche
  • 「システムは、通常、絶対クロック(低解像度の時刻クロック)と相対クロック(ある種の「高解像度」カウンタとの両方から「自走」時間を得ることができる)の両方を有する。計算)。時刻時計の解像度が低く、相対時計の解像度が高いのはなぜですか。 - Geek
  • たとえば、CPUタイムスタンプカウンタ(en.wikipedia.org/wiki/Time_Stamp_Counterこれは、大まかに言うと、内部プロセッサクロックサイクルごとにインクリメントされるためです。繰り返し割り込み信号の頻度ははるかに低いです。 - Konrad Reiche

8

メソッドのJavaDocをチェックするだけです。

System.nanoTime()

「...この方法は経過時間の測定にのみ使用でき、システムや壁時計の時間に関するその他の概念とは関係ありません。」

System.currentTimeMillis()

「...現在の時刻をミリ秒単位で返します。...」

測定中にシステム時間が変化するかどうかは、System.currentTimeMillis()測定間隔も変わります。ただし、を使用して間隔を測定しても変わりません。System.nanoTime()方法。


4

それはその価値System.currentTimeMillis()リターンは、マシンの内部時計から取得されます。システム管理者(またはNTP)が時間を変更した場合、たとえば、時計が5分高速で動作していることがわかり、システム管理者がそれを修正して修正した場合、System.currentTimeMillis()影響を受けます。これは、値が減少するのを見ることさえできることを意味します、そして、あなたが間隔を測定するためにそれを使うならば、タイミングはずれているかもしれません。あなたも測定することがありますタイミング。

System.nanoTime()一方、内部CPUカウンタ/クロックから派生した値を返します。この時計で計測された時間は、どのユーザーまたはプログラムによっても変更できません。これはタイミングの信頼性が高くなることを意味します。しかし、CPUクロックは電源を切るとリセットされるので、現在の「実時間」時間を見つけるのには役立ちません。

リンクされた質問


関連する質問

最近の質問