System.nanoTime()
的文档中有以下说明(重点标注如下)。
此方法仅用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒数(可能在未来,因此值可能为负)。此方法提供纳秒精度,但不一定提供纳秒准确度。不保证值的更改频率。
我认为可以有两种不同的解释:
上面加粗的句子是指单个返回值。然后,在数值意义上理解精度和准确性。精度是指有效数字的位数-截断的位置,准确性是指数字是否正确(例如在这里描述的)。
上面加粗的句子是指该方法本身的能力。然后,精度和准确性应按镖靶类比法解释(http://en.wikipedia.org/wiki/Precision_vs._accuracy#Accuracy_versus_precision:_the_target_analogy)。 因此,低准确性,高精度=>用高精度不断击中错误的值:假设物理时间静止,连续调用nanoTime()将返回相同的数值,但它与自参考时间以来经过的实际时间存在一些恒定偏差。
更新于2013年4月15日:Java 7关于System.nanoTime()
的文档已经更新,以解决之前措辞可能引起的困惑。
返回当前运行的Java虚拟机的高分辨率时间源的值,以纳秒为单位。
该方法只能用于测量经过的时间,并与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意的起始时间以来的纳秒数(也许在未来,因此值可能为负)。同一个Java虚拟机实例中的所有调用此方法的实例都使用相同的起源;其他虚拟机实例可能使用不同的起源。
该方法提供了纳秒级别的精度,但不一定提供纳秒分辨率(即值更改的频率)——除了分辨率至少与
currentTimeMillis()
的分辨率相同之外,没有任何保证。连续调用之间的差异跨越大约292年(263纳秒)的情况下,由于数字溢出,将无法正确计算经过的时间。
只有在计算同一Java虚拟机实例中获得的两个这样的值之间的差异时,此方法返回的值才具有意义。
x = nanoTime();
这将返回一些值,假设为958145
。如果你在正好一纳秒后调用nanoTime()
,你不能保证得到958146
。这意味着它返回的是纳秒,但不一定是两次调用之间经过的正确纳秒数。 - Bobby