我目前使用以下方式成功获取当前纳秒级别的时期时间:
Instant inst = Instant.now();
long time = inst.getEpochSecond();
time *= 1000000000l;
time += inst.getNano();
然而,对于我的使用情况来说,它有点太慢了,在JVM热身后每次调用大约需要1微秒
。
有没有更快的方法?
只要比上述方法更快,我就满意使用一个给我纪元微秒数的解决方案。
我目前使用以下方式成功获取当前纳秒级别的时期时间:
Instant inst = Instant.now();
long time = inst.getEpochSecond();
time *= 1000000000l;
time += inst.getNano();
然而,对于我的使用情况来说,它有点太慢了,在JVM热身后每次调用大约需要1微秒
。
有没有更快的方法?
只要比上述方法更快,我就满意使用一个给我纪元微秒数的解决方案。
可能有效的方法是运行:
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毫秒。因此不能保证您将获得微秒分辨率。System.nanoTime()
可能会在长时间内失去同步-因此这是精度和性能之间的权衡。另请参见:Java中的微秒级当前时间
0.2微秒
,我会很高兴。 - ABCSystem.currentTimeMillis()
和System.nanoTime()
。它们是内置函数,因此应该能够显著提高性能。 - Kayaman