在Java中获取纳秒级Unix时间戳的最快方法

3

我目前使用以下方式成功获取当前纳秒级别的时期时间:

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

然而,对于我的使用情况来说,它有点太慢了,在JVM热身后每次调用大约需要1微秒

有没有更快的方法?

只要比上述方法更快,我就满意使用一个给我纪元微秒数的解决方案。


@JohannesKuhn 我希望得到一个给我微秒而不是纳秒的解决方案,这样我会很高兴。 - ABC
你尝试过使用 System.currentTimeMillis() 吗? - Mohinuddin Luhar
@MohinuddinLuhar 我需要微小的分辨率。 - ABC
@Kayaman 我在我的交易系统中使用它们来驱动决策制定、日志记录等。如果我能在计算上节省0.2微秒,我会很高兴。 - ABC
请参考这里获取相关信息。如果可以的话,最好结合使用System.currentTimeMillis()System.nanoTime()。它们是内置函数,因此应该能够显著提高性能。 - Kayaman
显示剩余5条评论
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

可能有效的方法是运行:

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

多次重复直到n1和n2之间的差小于所需的分辨率(在我的PC上经过几次迭代后大约为400 ns)。

然后,您可以使用n1(或n2或两者的平均值...)与m * 1e6之间的差作为偏移量,需要将其添加到System.nanoTime()以获取当前时代的纳秒数。

免责声明:

  • System.nanoTime文档明确说明分辨率至少为System.currentTimeMillis()的分辨率,可能> 1毫秒。因此不能保证您将获得微秒分辨率。
  • 推论:这可能在所有环境中都不起作用(您可能永远无法使n2-n1足够小-或者它可能为0,只是因为您系统的分辨率太低)。
  • System.nanoTime()可能会在长时间内失去同步-因此这是精度和性能之间的权衡。
  • 您还需要考虑可能的算术溢出。

另请参见:Java中的微秒级当前时间


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,