のドキュメントにSystem.nanoTime()
は次のように書かれています(私の強調)。
この方法は経過時間を測定するためにのみ使用でき、システムや実時間のその他の概念とは関係ありません。返される値は、固定されているが任意の時間からのナノ秒を表します(おそらく将来的には、値が負になる可能性があります)。この方法はナノ秒の精度を提供しますが、必ずしもナノ秒の精度である必要はありません。値が変更される頻度については保証されません。
私が見ているように、これは2つの異なる方法で解釈できます。
上記の太字の文は、個々の戻り値を示しています。次に、精度と精度を数値の意味で理解する必要があります。つまり、精度は有効桁数(切り捨ての位置)を指し、精度はその数値が正しいかどうかを示します( 「精度」と「精度」の違いは何ですか?)
上記の太字の文は、メソッド自体の機能を示しています。次に、ダートボードのアナロジー(http://en.wikipedia.org/wiki/Precision_vs._accuracy#Accuracy_versus_precision:_the_target_analogy)に示されているように、精度と精度を理解する必要があります。したがって、低精度、高精度=>間違った値が高精度で繰り返しヒットされます。物理時間が静止していると想像すると、nanoTime()を連続して呼び出すと同じ数値が返されますが、実際の経過時間とは異なります。一定のオフセットによる基準時間。
正しい解釈はどれですか?私のポイントは、解釈2は、nanoTime()を使用した時間差の測定(2つの戻り値を差し引くことによる)がナノ秒に正しいことを意味します(測定の一定のエラー/オフセットが排除されるため)が、解釈1は測定間のこの種のコンプライアンスを保証するものではないため、必ずしも時間差測定の高精度を意味するわけではありません。
2013年4月15日更新:のJava 7ドキュメントSystem.nanoTime()
が更新され、以前の表現との混同の可能性に対処しました。
実行中のJava仮想マシンの高解像度タイムソースの現在の値をナノ秒単位で返します。
この方法は経過時間を測定するためにのみ使用でき、システムや実時間のその他の概念とは関係ありません。返される値は、固定されているが任意の起点時刻からのナノ秒を表します(おそらく将来的には、値が負になる可能性があります)。同じオリジンが、Java仮想マシンのインスタンスでのこのメソッドのすべての呼び出しで使用されます。他の仮想マシンインスタンスは、異なるオリジンを使用する可能性があります。
この方法はナノ秒の精度を提供しますが、必ずしもナノ秒の解像度(つまり、値が変化する頻度)ではありません。解像度が少なくとも。の解像度と同じである場合を除いて、保証は行われません
currentTimeMillis()
。約292年(2 63ナノ秒)を超える連続した呼び出しの違いは、数値のオーバーフローのために経過時間を正しく計算しません。
このメソッドによって返される値は、Java仮想マシンの同じインスタンス内で取得された2つのそのような値の差が計算された場合にのみ意味があります。