【发布时间】:2021-03-25 05:16:50
【问题描述】:
请仅在您完全理解问题后回答。
不要关闭,因为不存在类似的问题。
我知道System.nanoTime() 在JVM 启动后从任意“随机”点给出ns。而且我知道System.currentTimeMillis() 只提供ms 精度。
我正在寻找的是证明,并保持开放的心态,一旦我们尝试定义 确切的含义强>。
确切地说,在我的世界里,每次我们要注册一个新的ms,比如说,我们从97ms、98ms、99ms 等等,每次我们得到更新时,无论通过什么机制,我们不能指望至少观察到 Java 在切换时给我们nanosecond 精度。
我知道,我知道。这听起来很奇怪,但问题来了,ms 开关的准确度如何?
似乎当您反复询问System.nanoTime() 时,您将能够获得具有纳秒分辨率的线性图。
如果我们同时在System.nanoTime() 之后询问System.currentTimeMillis() 并且我们忽略命令成本的差异,那么在相同分辨率下似乎没有线性图。 ms 图表将 +-250ns。
这是意料之中的,但我找不到任何有关误差范围的信息,或毫秒的准确性。
此问题也存在于秒精度或小时精度、日、年等方面。到了年,误差有多大?
ms 出现时,ns 的术语误差有多大?
不能相信System.currenTimeMillis() 与System.nanoTime() 保持线性关系,我们不能指望System.currenTimeMillis() 跟上ns 的精度。
但是误差有多大?在计算中?在 Java 中,在 unix 系统中?
【问题讨论】:
-
System.currentTimeMillis()使用您的系统时钟,这可以说是 stackoverflow.com/q/2607263/869736 的副本。 -
"如果我们同时在
System.nanoTime()之后询问System.currentTimeMillis()并且我们忽略命令成本的差异,看起来好像没有线性图相同的分辨率。ms 图将 +-250ns。" - 你有任何证据证明这一说法吗? -
@mmm:是的,而且?正如我刚才所说,
System.currentTimeMillis()与您的系统时钟一样准确,因为它使用您的系统时钟。它的误差范围与系统时钟的误差范围相同。 -
来自
System.currentTimeMillis()documentation: "[...] 注意虽然返回值的时间单位是毫秒,值的粒度取决于底层操作系统,并且可能更大。[...]" 或者换句话说:您受制于操作系统。 -
区别在于
System.currentTimeMillis()依赖于操作系统,System.nanoTime()不(必然)。