System.nanoTime() 的 Java 时代? [复制]

Posted

技术标签:

【中文标题】System.nanoTime() 的 Java 时代? [复制]【英文标题】:Java epoch of System.nanoTime()? [duplicate] 【发布时间】:2021-09-21 21:17:52 【问题描述】:

我想知道System.nanoTime() 的时代是基于什么。 显然它不是基于 1970 年,因为 (System.nanoTime()/1000000L)(返回 31106704)不等于 System.currentTimeMillis()(返回 1626111981278)。

【问题讨论】:

这是完全任意的,如 Javadoc 中所述。您应该只使用 nanoTime 来测量经过的时间(在两次调用方法之间),因此偏移量无关紧要。 @AndyTurner 感谢您的回复!但我想知道是什么因素决定了时代。可能是计算机启动或JVM启动后的时间? 可能是,但不一定是。不要依赖它是任何可辨别的:减去两个纳米时间之间的差异并不重要。 您可以出于好奇尝试ZonedDateTime.now(ZoneId.systemDefault()).minusNanos(System.nanoTime())。不要依赖可重复的结果!下次运行相同的程序或升级 Java 时,它们可能会有所不同,并且在不同的 JVM 或不同的计算机上运行时,它们在实践中(不仅仅是理论上)很可能会有所不同。 【参考方案1】:

嗯,nanoTime() 的文档很清楚:

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

所以:

时代是特定于实现的,正是方法实现的作者认为可以工作的; 纪元在整个 JVM 中是固定的实例; 可能其中一个或两个值为负,但在这种情况下计算仍然正确。

那么,你应该关心时代吗?不,绝对不是。您对 的实现感到好奇吗?你不能,因为没有“the”实现。

【讨论】:

以上是关于System.nanoTime() 的 Java 时代? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java 计时,System.nanoTime() 比 System.currentTimeMillis() 更胜一筹,但它会在睡眠期间持续存在吗?

System.nanoTime理解

System.currentTimeMillis() 和 System.nanoTime() 哪个更快?别用错了!

System.currentTimeMillis() 和 System.nanoTime() 哪个更快?大部分人都会答错!

JVM源码分析之System.currentTimeMillis及nanoTime原理详解

Java性能优化的十条小技巧