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() 的精度与准确度 的相关文章

  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐