【发布时间】:2012-07-12 13:11:43
【问题描述】:
System.nanoTime() 的文档说明如下(强调我的)。
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒(可能在将来,因此值可能为负数)。 此方法提供纳秒级精度,但不一定提供纳秒级精度。不保证值的变化频率。
在我看来,这可以用两种不同的方式来解释:
上面粗体中的句子是指单独的返回值。然后,精度和准确度要从数字的意义上来理解。即精度是指有效数字的个数——截断的位置,而精度是指数字是否正确(如这里的置顶答案中描述的) What is the difference between 'precision' and 'accuracy'?)
上面粗体中的句子是指方法本身的能力。然后,精度和准确性将被理解为飞镖类比所说明的 (http://en.wikipedia.org/wiki/Precision_vs._accuracy#Accuracy_versus_precision:_the_target_analogy)。 因此,低精度,高精度 => 错误的值被重复击中:假设物理时间静止,连续调用 nanoTime() 返回相同的数值,但它与实际经过的时间不同,因为参考时间由一些常数偏移量。
哪种解释是正确的?我的观点是,解释 2 意味着使用 nanoTime() (通过减去两个返回值)测量时间 差异 将是正确的纳秒(因为测量中的恒定误差/偏移量将是消除),而解释 1 不能保证测量之间的那种一致性,因此不一定意味着时差测量的高精度。
2013 年 4 月 15 日更新:System.nanoTime() 的 Java 7 文档已更新,以解决可能与之前的措辞混淆的问题。
返回正在运行的 Java 虚拟机的高分辨率时间源的当前值,以纳秒为单位。
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意的 origin 时间以来的纳秒(可能在将来,因此值可能为负数)。在 Java 虚拟机实例中,此方法的所有调用都使用相同的来源;其他虚拟机实例可能使用不同的来源。
此方法提供纳秒精度,但不一定提供纳秒分辨率(即值更改的频率) - 不保证分辨率至少与
currentTimeMillis()一样好。由于数值溢出,超过大约 292 年(263 纳秒)的连续调用的差异将无法正确计算经过的时间。
只有在计算同一 Java 虚拟机实例中获得的两个此类值之间的差异时,此方法返回的值才有意义。
【问题讨论】:
-
据我所知,该功能取决于操作系统返回纳秒的可能性。所以,假设你得到了
x = nanoTime();,这会给你带来一些价值,让我们假设958145。如果您在一纳秒后调用nanoTime(),则不能保证您会得到958146。这意味着它返回纳秒,但不一定是两次调用之间经过的正确纳秒量。 -
哇——对一个重要的有趣话题提出了一个措辞得体的问题!
-
292 年很高兴知道我是否为长期太空任务编写了软件。