我可以从System.nanoTime中合理期望的最差分辨率是多少?

Mic*_*ael 11 java linux windows time

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

我打算System.currentTimeMillis结合System.nanoTime这种方式使用,虽然它只是一个粗略的代码草图:

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;
}
Run Code Online (Sandbox Code Playgroud)

文档nanoTime说:

这种方法提供纳秒级精度,但不一定是纳秒级分辨率(即,值的变化频率) - 除了分辨率至少与分辨率一样好之外,不做任何保证currentTimeMillis().

所以它没有给我们任何优于毫秒的分辨率保证.

更深入一点nanoTime(在可预见的本地方法下):

  • Windows使用的QueryPerformanceCounterAPI承诺分辨率小于1微秒,这很棒.

  • Linux使用clock_gettime带有标志来确保值是单调的,但不会对解决方案做出任何承诺.

  • Solaris类似于Linux

  • 该消息来源没有提到OSX或基于Unix的操作系统如何处理这个问题.

(来源)

我已经看到了一些模糊的暗示,它将" 通常 "具有微秒分辨率,例如另一个问题的答案:

在大多数系统中,三个最低有效数字始终为零.这实际上提供了微秒精度,但是以纳秒的固定精度水平报告.

但是没有来源,"通常"这个词非常主观.

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


我正在使用Java 1.6,但如果在这个问题上有很多好处的话我可以升级的可能性很小.

the*_*472 8

问题:在什么情况下nanoTime会返回分辨率低于微秒的值?某些常用的操作系统,硬件,JVM等可能会影响到什么?如果可以,请尝试提供来源.

询问有关违反该约束的所有可能情况的详尽列表似乎有点多,没有人知道您的软件将在哪些环境下运行.但为了证明它可能发生,请参阅aleksey shipilev撰写的这篇博客文章,其中他描述了一个案例,由于争用,纳米级在Windows机器上变得不那么准确(就其自身的延迟而言)而不是微秒.

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

由于平台和特定于硬件的行为,规范已被故意模糊.

一旦您确认您正在使用的硬件和操作系统确实提供了您所需要的并且VM通过必要的功能,您就可以"合理地期望"微秒精度.