在 Java 中获取 nanos unix 纪元时间的最快方法

Posted

技术标签:

【中文标题】在 Java 中获取 nanos unix 纪元时间的最快方法【英文标题】:Fastest way to get nanos unix epoch time in Java 【发布时间】:2020-02-06 15:58:30 【问题描述】:

我目前这样做是为了成功获取当前的纪元时间:

Instant inst = Instant.now();
long time = inst.getEpochSecond();
time *= 1000000000l;
time += inst.getNano();

但是,对于我的用例来说,它有点太慢了,在 JVM 预热后每次调用大约 1us

有更快的方法吗?

我很满意一个解决方案,它给我自纪元以来的微秒,只要它比上述更快。

【问题讨论】:

大多数计算机硬件无法以纳秒为单位测量时间。 @JohannesKuhn 我很高兴有一个解决方案可以为我提供微秒而不是纳秒。 您可能需要深入了解本机代码以获得高性能计时器。 Instant 方法一定会很慢,结果可能会有所不同。您将这些值用于什么目的? 你用 System.currentTimeMillis() 试过了吗 @MohinuddinLuhar 我需要微分辨率 【参考方案1】:

可能的工作是运行:

long n1 = System.nanoTime();
long m = System.currentTimeMillis();
long n2 = System.nanoTime();

多次,直到 n1 和 n2 之间的差异小于您想要的分辨率(经过几次迭代,在我的 PC 上大约为 400 ns)。

然后您可以使用 n1(或 n2 或 2...的平均值)和 m * 1e6 之间的差异作为您需要添加到 System.nanoTime() 以获得当前纪元纳秒的偏移量。

免责声明:

System.nanoTime doc 明确指出分辨率至少是 System.currentTimeMillis() 的分辨率,可能大于 1 毫秒。所以不能保证你会得到微秒级的分辨率。 推论:这可能不适用于所有环境(您可能永远无法获得足够小的 n2-n1 - 或者它可能只是因为您的系统分辨率太低而为 0)。 System.nanoTime() 可能会长时间不同步 - 所以这是精度和性能之间的权衡。 您还需要考虑可能的算术溢出。

另请参阅:Current time in microseconds in java

【讨论】:

以上是关于在 Java 中获取 nanos unix 纪元时间的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Oracle 日期获取 unix 纪元?

日期时间和熊猫之间的 Unix 纪元值不匹配

从 CalendarView 获取自 UNIX 纪元以来的 Millis 时间

用于在 GMT 中获取 UNIX 时间戳的快速 Java 6 实现

Unix 纪元时间到 Java Date 对象

如何从给定城市的给定日期和时间获取 unix 纪元时间戳(以秒为单位)?