System.nanoTime() 的精度与准确度

2024-02-05

的文档System.nanoTime() http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#nanoTime()说以下(强调我的)。

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间(可能在未来,因此值可能为负)以来的纳秒。此方法提供纳秒精度,但不一定是纳秒精度。不保证值变化的频率。

在我看来,这可以用两种不同的方式解释:

  1. 中的句子bold以上指的是单独的返回值。然后,精度和准确度应从数字意义上理解。也就是说,精度是指有效数字的位数 - 截断的位置,而准确性是指数字是否正确(例如这里的最佳答案中描述的)“精确度”和“准确度”有什么区别? https://stackoverflow.com/questions/8270789/what-is-the-difference-between-precision-and-accuracy )

  2. 中的句子bold以上指的是方法本身的能力。然后,精度和准确度应按照飞镖靶的类比来理解 (http://en.wikipedia.org/wiki/Precision_vs._accuracy#Accuracy_versus_ precision:_the_target_analogy http://en.wikipedia.org/wiki/Precision_vs._accuracy#Accuracy_versus_precision:_the_target_analogy)。 因此,低精度,高精度 => 以高精度重复命中错误的值:想象物理时间静止不动,连续调用 nanoTime() 返回相同的数值,但它与自开始以来的实际经过时间有所偏差。一些人的参考时间constant offset.

哪一种解释是正确的?我的观点是,解释 2 意味着时间的度量不同之处使用 nanoTime() (通过减去两个返回值)将正确到纳秒(因为测量中的恒定误差/偏移将被消除),而解释 1 不能保证测量之间的这种一致性,因此不会必然意味着时差测量的高精度。


2013 年 4 月 15 日更新:Java 7 文档System.nanoTime() http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime()已更新,以解决与先前措辞可能混淆的问题。

返回正在运行的 Java 虚拟机的高分辨率时间源的当前值(以纳秒为单位)。

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示纳秒,因为某些固定但任意origin时间(也许在未来,所以值可能为负)。 Java 虚拟机实例中此方法的所有调用都使用相同的源;其他虚拟机实例可能使用不同的源。

此方法提供纳秒精度,但不一定是纳秒分辨率(即值变化的频率) - 除了分辨率至少与以下方法一样好之外,不做任何保证currentTimeMillis() http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#currentTimeMillis().

Differences in successive calls that span greater than approximately 292 years (263 nanoseconds) will not correctly compute elapsed time due to numerical overflow.

仅当计算在同一 Java 虚拟机实例中获得的两个此类值之间的差异时,此方法返回的值才有意义。


在 Clojure 命令行中,我得到:

user=> (- (System/nanoTime) (System/nanoTime))
0
user=> (- (System/nanoTime) (System/nanoTime))
0
user=> (- (System/nanoTime) (System/nanoTime))
-641
user=> (- (System/nanoTime) (System/nanoTime))
0
user=> (- (System/nanoTime) (System/nanoTime))
-642
user=> (- (System/nanoTime) (System/nanoTime))
-641
user=> (- (System/nanoTime) (System/nanoTime))
-641

所以本质上,nanoTime不会每纳秒更新一次,这与人们直观地期望的相反精确。在Windows系统中,它使用QueryPerformanceCounterAPI 底层(根据本文 https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks),实际上似乎给出了大约 640 ns解决(在我的系统中!)。

注意nanoTime本身不能有任何accuracy根本没有,因为它的绝对值是任意的。只有不同之处连续之间nanoTime打电话才有意义。该差异的(内)精度约为 1 微秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.nanoTime() 的精度与准确度 的相关文章

随机推荐