长期以来,我使用System.currentTimeMillis()
来测量耗时,直到最近才发现我也可以使用nanoTime()
。但是,有些结果不是我期望的,因为nanoTime
可以从任意时间点开始测量时间,而不是01-01-1970
可以测量currentTimeMillis
。
从JavaDoc for nanoTime
:
我对任意部分感到困惑。仅当两个调用的引用时间戳相同时,才能测量耗时。但是,在API文档中不能保证这一点。我认为这就是我提到的问题的原因。使用的时间是实现细节,因此我不能依靠它。
我想知道何时可以充分利用nanoTime
,在哪种情况下会出现严重错误。我想到的主要用例是:
nanoTime
时间戳nanoTime
时间戳(例如,思考,来自先前应用程序运行的序列化时间戳,或作为消息的一部分传递给另一JVM)nanoTime
时间戳在StackOverflow上有一些帖子可以解决部分问题,但是很大程度上没有选择时间的问题:
尤其是最后一个the link明确表明可以使用
nanoTime
时存在一些限制,但是在不完全了解这些限制的情况下,使用它的内在本质上似乎是不安全的,因为基于它的功能可能会失败。 最佳答案
文档也许对此应该是明确的,但是“固定但任意”的含义是在同一JVM中(即,在同一运行的JVM实例中),引用值是固定的。
因此(1)是安全的,但不能超出此范围。
除此之外,还取决于实现的怪癖。
关于java - 用nanoTime()耗时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35111550/