我时不时地提到System.nanoTime()System.currentTimeMillis()慢很多(调用可能要花费微秒的时间),但是校对链接通常已经过时,或者导致一些颇为自以为是的博客帖子,这些帖子不能真正被信任或包含信息。与特定平台有关,或与此有关,依此类推。

我没有进行基准测试,因为我对这种敏感问题进行实验的能力很现实,但是我的条件确实很明确,所以我希望得到一个简单的答案。

因此,在平均64位Linux(意味着64位JRE),Java 8和现代硬件上,切换到nanoTime()会花费我几微秒的调用时间吗?我应该留在currentTimeMillis()吗?

最佳答案

与往常一样,这取决于您使用它的目的。由于其他人正在打击nanoTime,因此我将插入一个插件。我只使用nanoTime来测量生产代码中的经过时间

我在生产中回避了currentTimeMillis,因为我通常需要一个不会像挂钟可以(并且确实)那样来回跳动的时钟。这在使用基于计时器的重要决策的系统中至关重要。 nanoTime应该以您期望的速率单调增加。

实际上,我的一位同事说“currentTimeMillis仅对人类娱乐有用”(例如调试日志中的时间或网站上显示的时间),因为无法信任它来测量经过的时间。

但是,实际上,我们尽量不使用时间,并试图将时间限制在协议(protocol)之外。然后我们尝试使用逻辑时钟;最后,如果绝对必要,我们使用基于nanoTime的持续时间。

更新:在连接两个主机时,有一个地方我们使用currentTimeMillis进行完整性检查,但是我们要检查主机的时钟是否相隔5分钟以上。

10-08 10:59