在 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 纪元时间的最快方法的主要内容,如果未能解决你的问题,请参考以下文章
从 CalendarView 获取自 UNIX 纪元以来的 Millis 时间