我知道那套系统。nanoTime()现在是测量系统时间的首选方法。currentTimeInMillis()
。第一个明显的原因是nanoTime()提供了更精确的计时,另一个原因是我读到的,后者受到系统实时时钟调整的影响。“受到系统实时时钟的影响”是什么意思?
这意味着系统的值。currentTimeMillis()
从机器的内部时钟获取返回值。如果系统管理员(或NTP)更改了时间,例如,如果发现时钟快了5分钟,系统管理员会去纠正它,System。currentTimeMillis()
将受到影响。这意味着您甚至可以看到该值降低,如果您使用它来测量时间间隔,则计时可能会关闭。你甚至可以测量负计时。
系统。另一方面,nanoTime()
返回从某个内部CPU计数器/时钟派生的值。任何用户或程序都无法更改此时钟测量的时间。这意味着它的计时更加可靠。但是CPU时钟会在断电时重置,因此它对于查找当前的“挂钟”时间没有用处。
只需检查方法的JavaDoc:
系统。nanoTime()
“……该方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关……”
系统。currentTimeMillis()
“…以毫秒为单位返回当前时间…”
因此,您可以使用系统查看系统时间在测量过程中是否发生变化。currentTimeMillis()
,您测量的间隔也会改变。但是,当使用系统测量间隔时,它不会改变。nanoTime()
方法。
在这种情况下,我发现以下博客文章摘录很有用:
如果您对测量绝对时间感兴趣,请始终使用系统。currentTimeMillis()
。请注意,它的分辨率可能相当粗糙(尽管在绝对时间内,这很少是一个问题)
如果您对测量/计算运行时间感兴趣,那么请始终使用System.nanoTime()
。在大多数系统中,它将给出微秒量级的分辨率。不过请注意,在某些平台上执行此调用也可能需要微秒。
时钟和计时器-大卫·霍姆斯的概述
因为系统。currentTimeMillis()
依赖于系统的每日时间时钟,对时间的调整是合理的,以保持其准时。
这里的调整是什么意思?举个例子,看看Linux上的CLOCK_REALTIME
的描述:
测量实际(即挂钟)时间的系统时钟。设置该时钟需要适当的权限。该时钟受到系统时间中不连续跳跃的影响(例如,如果系统管理员手动更改时钟),以及由adtime(3)和NTP执行的增量调整。