长期以来,我使用来测量经过时间System.currentTimeMillis(),直到最近才发现我也可以使用nanoTime()。然而,一些结果不是我所期待的,因为nanoTime测量的时间从任意时间点,而不是01-01-1970为currentTimeMillis做。
返回最精确的可用系统计时器的当前值(以纳秒为单位)。
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒 (也许是将来的时间,因此值可能为负)。此方法提供纳秒精度,但不一定提供纳秒精度。不能保证值更改的频率。由于数值溢出,跨越大约292年(263纳秒)的连续呼叫中的差异将无法准确计算经过的时间。
例如,要测量某些代码执行所需的时间:
Run Code Online (Sandbox Code Playgroud)long startTime = System.nanoTime(); // ... the code being measured ... long estimatedTime = System.nanoTime() - startTime;
我对任意部分感到困惑。仅当两个呼叫的参考时间戳相同时,才能测量经过的时间。但是在API文档中不能保证。我认为这就是我提到的问题的原因。使用的时间是实现细节,因此我不能依靠它。
我想知道什么时候可以充分利用,nanoTime在什么情况下会出现严重错误。我想到的主要用例是:
nanoTime来自不同线程的时间戳nanoTime来自同一JVM的不同实例的时间戳(例如,思考,来自先前应用程序运行的序列化时间戳,或作为消息的一部分传递给另一JVM)nanoTime不同JVM实现中的时间戳在StackOverflow上有一些帖子可以解决部分问题,但是很大程度上没有选择时间:
尤其是最后一个链接清楚地表明,何时 nanoTime可以使用存在一些限制,但是在不完全了解这些限制的情况下,使用它似乎本质上是不安全的,因为基于它的功能可能会失败。
文档也许应该明确说明这一点,但他们所说的“固定但任意”的意思是在同一个 JVM 内(即在同一个运行的 JVM 实例内),参考值是固定的。
所以(1)是安全的,但也不会超出这个范围。
除此之外的任何事情都取决于实施的怪癖。
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |