用nanoTime()经过的时间

hot*_*zst 5 java

长期以来,我使用来测量经过时间System.currentTimeMillis(),直到最近才发现我也可以使用nanoTime()。然而,一些结果不是我所期待的,因为nanoTime测量的时间从任意时间点,而不是01-01-1970currentTimeMillis做。

JavaDoc中获取nanoTime

返回最精确的可用系统计时器的当前值(以纳秒为单位)。

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒 (也许是将来的时间,因此值可能为负)。此方法提供纳秒精度,但不一定提供纳秒精度。不能保证值更改的频率。由于数值溢出,跨越大约292年(263纳秒)的连续呼叫中的差异将无法准确计算经过的时间。

例如,要测量某些代码执行所需的时间:

long startTime = System.nanoTime();
// ... the code being measured ...    
long estimatedTime = System.nanoTime() - startTime;
Run Code Online (Sandbox Code Playgroud)

我对任意部分感到困惑。仅当两个呼叫的参考时间戳相同时,才能测量经过的时间。但是在API文档中不能保证。我认为这就是我提到的问题的原因。使用的时间是实现细节,因此我不能依靠它。

我想知道什么时候可以充分利用,nanoTime在什么情况下会出现严重错误。我想到的主要用例是:

  • 比较nanoTime来自不同线程的时间戳
  • 比较nanoTime来自同一JVM的不同实例的时间戳(例如,思考,来自先前应用程序运行的序列化时间戳,或作为消息的一部分传递给另一JVM)
  • 比较nanoTime不同JVM实现中的时间戳

在StackOverflow上有一些帖子可以解决部分问题,但是很大程度上没有选择时间:

尤其是最后一个链接清楚地表明,何时 nanoTime可以使用存在一些限制,但是在不完全了解这些限制的情况下,使用它似乎本质上是不安全的,因为基于它的功能可能会失败。

Dan*_*tin 1

文档也许应该明确说明这一点,但他们所说的“固定但任意”的意思是在同一个 JVM 内(即在同一个运行的 JVM 实例内),参考值是固定的。

所以(1)是安全的,但也不会超出这个范围。

除此之外的任何事情都取决于实施的怪癖。