当前位置: 首页 > 知识库问答 >
问题:

System.currenTimeInMillis()vs System.nanoTime()

陆栋
2023-03-14

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

共有3个答案

周威
2023-03-14

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

系统。另一方面,nanoTime()返回从某个内部CPU计数器/时钟派生的值。任何用户或程序都无法更改此时钟测量的时间。这意味着它的计时更加可靠。但是CPU时钟会在断电时重置,因此它对于查找当前的“挂钟”时间没有用处。

竺翰海
2023-03-14

只需检查方法的JavaDoc:

系统。nanoTime()

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

系统。currentTimeMillis()

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

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

西门旻
2023-03-14

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

如果您对测量绝对时间感兴趣,请始终使用系统。currentTimeMillis()。请注意,它的分辨率可能相当粗糙(尽管在绝对时间内,这很少是一个问题)

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

时钟和计时器-大卫·霍姆斯的概述

因为系统。currentTimeMillis()依赖于系统的每日时间时钟,对时间的调整是合理的,以保持其准时。

这里的调整是什么意思?举个例子,看看Linux上的CLOCK_REALTIME的描述:

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

 类似资料:

相关问答

相关文章

相关阅读