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、处理器支持)上确保: