java - 精度 vs System.nanoTime( )的准确性

  显示原文与译文双语对照的内容
0 0

的文档System.nanoTime()说以下( 我的重点) 。

此方法只能用于测量运行时间,并和其他执行系统和挂钟时间的概念。 返回的值是纳秒,因为某些固定但是任意时间( 也许在将来,所以值可能为负数) 。 此方法提供毫微秒精度,但未必具有毫微秒的准确性。 不保证有关频率值进行了更改。

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

  1. 上面的句子在粗体指各个返回值。 然后,精度和准确性要理解数字意义。 即精度是指有效位数的位置截断,和精度数是否正确的人( 如前回答所述这 What的区别是'精度'和'精度'? )

  2. 上面的句子在粗体指的能力本身的方法。 然后,精度和准确性要理解如上图所示掷镖的圆靶类比( http://en .wikipedia .org/wiki/Precision_vs ._accuracy#Accuracy_versus_precision:_the_target_analogy ) 。 所以,低精度和高精度,高精度=>错误值为多次命中: 想象一下如果物理时间静止,nanoTime( ) 的连续调用返回相同的数值,但它已经与实际运行时间,因为时间缩短一些常数的引用偏移。

其解释是正确的一个? 我的观点是,解释2 意味着计时单位差异使用nanoTime( ) ( 减去两个值) 会正确返回到纳秒( 因为不断error/offset在度量会被淘汰),而解释1 将不保证这种一致性测量之间的时间差,因此不会一定意味着很高的精度测量。


Updated 4/15/13: 在Java 7 文档。System.nanoTime()已更新以满足可能的混淆与以前的措词。

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

此方法只能用于测量运行时间,并和其他执行系统和挂钟时间的概念。 返回的值是纳秒,因为某些固定但任意原点时间( 也许在将来,所以值可能为负) 。 同源由所有调用此方法的实例中的Java虚拟机,其他虚拟机实例可能会使用不同的原点。

此方法提供毫微秒精度,但并不具有毫微秒的分辨率( 即频率值更改) 不保证进行的区别在于分辨率至少是一样好,currentTimeMillis()

连续调用之间的区别,它们涵盖超过292年( 大约2 63 纳秒) 不能正确计算运行时间因数字溢出。

此方法返回的值之间的区别变得有意义的只有两个这样的同一个实例中获取值,将计算出Java虚拟机,。

时间:原作者:7个回答

0 0

第一种解释是正确的。 大多数系统上的三个最小有效位数将始终为零。 即有效提供微秒级的精确性,但却报告它在固定精度级别的纳秒。

事实上,现在我重新考量,你的第二种解释也是一个有效说明正在发生的事情,也许更甚。 想象freezed时间,报表将始终不变错误正确的纳秒数,但是如果理解为整数的微秒数。

原作者:
0 0

在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高级选项( 根据本文 ),这在实践中似乎提前许多天就有关640 ns 分辨率 ( 放到我系统) 。

请注意, nanoTime可以靠它自己不能有任何准确性根本,因为其绝对值是任意的。 只有差异之间连续 nanoTime调用才有意义。 绘制之( in ),区别在于方式也为1 微秒。

原作者:
0 0

一种很有趣的特性之间的差异 System.currentTimeMillis()& System.nanoTime()就是 System.nanoTime()不会更改与挂钟。 我Windows虚拟机上运行代码,有大量时间漂移。 System.currentTimeMillis()12点前可以向前和向后跳秒每次当NTP纠正这个漂移,制作准确时间戳没有意义。 ( windows 2003,2008 VPS版本)

System.nanoTime()但是,并不影响通过NTP检索并应用修正基于更改挂钟时间,因此你可能需要一些时间 System.nanoTime()因为NTP什么时候检查最后一个和你有了更加准确的时间比 System.currentTimeMillis()在条件恶劣的挂钟

它当然是违反直觉,但对了解

原作者:
...