23

我知道这System.nanoTime()是现在测量时间的首选方法System.currentTimeInMillis() 。第一个明显的原因是 nanoTime() 提供了更精确的计时,另一个原因是我读到后者受系统实时时钟调整的影响。“受到系统实时时钟的影响”是什么意思?

4

3 回答 3

25

在这种情况下,我发现以下博客文章摘录很有用:

如果您对测量绝对时间感兴趣,请始终使用 System.currentTimeMillis(). 请注意,它的分辨率可能非常粗糙(尽管这在绝对时代很少成为问题。)

如果您对测量/计算经过的时间感兴趣,请始终使用System.nanoTime(). 在大多数系统上,它会给出微秒级的分辨率。但请注意,此调用在某些平台上也可能需要几微秒才能执行。

时钟和计时器 - David Holmes概述

由于System.currentTimeMillis()依赖于系统时钟,因此对时间的调整是合法的,以保持准时。

这里的调整是什么意思?例如看一下CLOCK_REALTIME来自 Linux 的描述:

测量实际(即挂钟)时间的系统范围的时钟。设置此时钟需要适当的权限。此时钟 受系统时间的不连续跳跃(例如,如果系统管理员手动更改时钟)以及 adjtime(3) 和 NTP 执行的增量调整的影响。

于 2012-07-21T09:28:21.160 回答
8

只需检查方法的 JavaDoc:

System.nanoTime()

“......这种方法只能用于测量经过的时间,与任何其他系统或挂钟时间的概念无关......”

System.currentTimeMillis()

“...以毫秒为单位返回当前时间。...”

因此,您可以使用 来查看系统时间是否在测量期间发生变化System.currentTimeMillis(),您测量的时间间隔也会发生变化。System.nanoTime()但是,使用该方法测量间隔时,它不会改变。

于 2012-07-21T09:34:47.820 回答
4

这意味着System.currentTimeMillis()返回的值是从机器的内部时钟中获取的。如果系统管理员(或 NTP)更改时间,例如,如果发现时钟快了 5 分钟并且系统管理员去纠正它,System.currentTimeMillis()将会受到影响。这意味着您甚至可以看到该值减少,如果您使用它来测量间隔,则计时可能会关闭。你甚至可以测量时间。

System.nanoTime() on the other hand returns a value that is derived from some internal CPU counter/clock. The time measured by this clock cannot be changed by any user or program. This means that it will be more reliable for timing. But the CPU clock is reset on poweroff so it's not useful for finding the current "wall-clock" time.

于 2012-07-21T09:37:54.493 回答