Java 什么';这是我从System.nanoTime可以合理预期的最差的分辨率?

Java 什么';这是我从System.nanoTime可以合理预期的最差的分辨率?,java,linux,windows,time,Java,Linux,Windows,Time,我正在编写需要微秒或更高分辨率的时间戳的软件 我计划结合使用类似的代码,尽管它只是一个粗略的代码草图: private static final long absoluteTime = (System.currentTimeMillis() * 1000 * 1000); private static final long relativeTime = System.nanoTime(); public long getTime() { final long delta = Syste

我正在编写需要微秒或更高分辨率的时间戳的软件

我计划结合使用类似的代码,尽管它只是一个粗略的代码草图:

private static final long absoluteTime = (System.currentTimeMillis() * 1000 * 1000);
private static final long relativeTime = System.nanoTime();

public long getTime()
{
    final long delta = System.nanoTime() - relativeTime;
    if (delta < 0) throw new IllegalStateException("time delta is negative");
    return absoluteTime  + delta;
}
private static final long absoluteTime=(System.currentTimeMillis()*1000*1000);
私有静态最终长相对时间=System.nanoTime();
公共长getTime()
{
最终长增量=System.nanoTime()-相对时间;
如果(增量<0)抛出新的非法状态异常(“时间增量为负”);
返回绝对时间+增量;
}
nanoTime
的文档说明:

该方法提供纳秒精度,但不一定 纳秒分辨率(即值变化的频率)-否 作出保证,但决议至少与
currentTimeMillis()
的值

所以它没有给我们一个比毫秒更好的分辨率保证

nanoTime
(可以预见这是一种原生方法)的掩护下,再深入一点:

  • Windows使用的API承诺 分辨率小于一微秒,这是伟大的

  • Linux使用一个标志来确保值是 单调,但不承诺决心

  • Solaris类似于Linux

  • 消息来源没有提到OSX或基于Unix的OSs如何处理这个问题

()

我已经看到一些模糊的暗示,它“通常”会有微秒的分辨率,比如在另一个问题上:

在大多数系统上,三个最低有效数字总是 零。这实际上提供了微秒的准确度,但在 一纳秒的固定精度水平

但是没有来源,“通常”这个词是非常主观的

问题:在什么情况下,
nanoTime
会返回分辨率低于微秒的值?例如,可能一个主要的操作系统版本不支持它,或者需要一个特定的硬件功能,而这个功能可能不存在。请尽量提供来源,如果可以的话


我使用的是Java1.6,但是如果在这个问题上有实质性的好处,那么我很有可能升级

问:在什么情况下,nanoTime会返回分辨率低于微秒的值?这可能会影响哪些常用的操作系统、硬件、JVM等?请尽量提供来源,如果可以的话

要求列出所有可能违反该约束的情况似乎有点过分,没有人知道您的软件将在哪些环境下运行。但为了证明这是可能发生的,他描述了一个例子,由于争用,纳米时间在windows机器上变得不如一微秒精确(就其自身的延迟而言)

另一种情况是在虚拟机下运行的软件,它以非常粗糙的方式模拟硬件时钟

由于特定于平台和硬件的行为,该规范被故意含糊不清


一旦您确认所使用的硬件和操作系统确实提供了您所需要的,并且虚拟机通过了必要的功能,您就可以“合理地期望”微秒精度。

我很好奇您的用例是什么。显然,您不能期望时钟在设备之间进行如此紧密的同步。如果您正在从硬件记录某些内容,那么您将受到中断率的限制。@user695022这是金融法规,它规定,我们的时间戳必须如此精细,以便于审计。它们目前以毫秒为单位。请注意负数检查,它看起来非常正常,但可能会有时钟不平衡导致负数。例如,您已经找到了它所委托的特定于平台的方法。您必须调查这些特定于平台的方法的行为。linux的clock\u gettime行为因硬件提供的内容而异。最终,由于特定于平台和硬件的行为,规范被有意地留下了模糊的内容。我并不是想要一个详尽的列表,也许提及一些可能会限制OSs提供这种解决方案能力的硬件功能会更好。如果我们将自己限制在x86和linux上,那么您基本上希望确保java以最终使用RDTSC指令的方式调用
clock\u gettime
,您需要在多个级别(java、操作系统、VM、处理器支持)上确保: