我时不时地提到System.nanoTime()
比System.currentTimeMillis()
慢很多(调用可能要花费微秒的时间),但是校对链接通常已经过时,或者导致一些颇为自以为是的博客帖子,这些帖子不能真正被信任或包含信息。与特定平台有关,或与此有关,依此类推。
我没有进行基准测试,因为我对这种敏感问题进行实验的能力很现实,但是我的条件确实很明确,所以我希望得到一个简单的答案。
因此,在平均64位Linux(意味着64位JRE),Java 8和现代硬件上,切换到nanoTime()
会花费我几微秒的调用时间吗?我应该留在currentTimeMillis()
吗?
最佳答案
与往常一样,这取决于您使用它的目的。由于其他人正在打击nanoTime
,因此我将插入一个插件。我只使用nanoTime
来测量生产代码中的经过时间。
我在生产中回避了currentTimeMillis
,因为我通常需要一个不会像挂钟可以(并且确实)那样来回跳动的时钟。这在使用基于计时器的重要决策的系统中至关重要。 nanoTime
应该以您期望的速率单调增加。
实际上,我的一位同事说“currentTimeMillis
仅对人类娱乐有用”(例如调试日志中的时间或网站上显示的时间),因为无法信任它来测量经过的时间。
但是,实际上,我们尽量不使用时间,并试图将时间限制在协议(protocol)之外。然后我们尝试使用逻辑时钟;最后,如果绝对必要,我们使用基于nanoTime
的持续时间。
更新:在连接两个主机时,有一个地方我们使用currentTimeMillis
进行完整性检查,但是我们要检查主机的时钟是否相隔5分钟以上。