文档System.nanoTime()
说明如下(强调我的)。
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒(可能在将来,因此值可能为负数)。此方法提供纳秒精度,但不一定提供纳秒精度。不保证值的变化频率。
在我看来,这可以用两种不同的方式来解释:
上面粗体字是指单独的返回值。然后,精度和准确度要从数字的意义上来理解。也就是说,精度是指有效数字的个数——截断的位置,而精度是数字是否正确(比如这里的顶部答案中描述的 'precision'和'accuracy'有什么区别?)
上面粗体字是指方法本身的能力。然后,精度和准确性将被理解为飞镖类比(http://en.wikipedia.org/wiki/Precision_vs._accuracy#Accuracy_versus_precision:_the_target_analogy)。所以,低精度,高精度 => 错误的值被重复命中,精度很高:想象物理时间静止,连续调用 nanoTime() 返回相同的数值,但它与实际经过的时间不同,因为参考时间由一些恒定的偏移量。
哪种解释是正确的?我的观点是,解释 2 意味着使用 nanoTime() 测量时间差(通过减去两个返回值)将正确到纳秒(因为测量中的恒定误差/偏移将被消除),而解释 1 将'不能保证测量之间的这种一致性,因此不一定意味着时差测量的高精度。
2013 年 4 月 15 日更新: Java 7 文档System.nanoTime()
已更新,以解决可能与之前的措辞混淆的问题。
返回正在运行的 Java 虚拟机的高分辨率时间源的当前值,以纳秒为单位。
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意的原始时间以来的纳秒(可能在将来,因此值可能为负数)。在 Java 虚拟机实例中,此方法的所有调用都使用相同的来源;其他虚拟机实例可能使用不同的来源。
此方法提供纳秒精度,但不一定提供纳秒分辨率(即值更改的频率) - 除了分辨率至少与
currentTimeMillis()
.由于数值溢出,超过大约 292 年(2 63纳秒)的连续调用的差异将无法正确计算经过的时间。
仅当计算在 Java 虚拟机的同一实例中获得的两个此类值之间的差异时,此方法返回的值才有意义。