System.currenTtimeMillis()vs System.nanoTime()

时间:2012-07-21 09:22:42

标签: java

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

3 个答案:

答案 0 :(得分:25)

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

  

如果您对测量绝对时间感兴趣,请始终使用   System.currentTimeMillis()。请注意,它的分辨率可能相当   粗糙(虽然这绝对不是绝对时期的问题。)

     

如果您对测量/计算经过时间感兴趣,那么   始终使用System.nanoTime()。在大多数系统上它会给出一个   分辨率为微秒级。请注意,这个电话   也可以在某些平台上执行微秒。

David Holmes的

Clocks and Timers - General Overview

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

这意味着什么调整?例如,查看Linux中CLOCK_REALTIME的描述:

  

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

答案 1 :(得分:8)

只需检查方法的JavaDoc:

System.nanoTime()

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

System.currentTimeMillis()

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

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

答案 2 :(得分:4)

这意味着System.currentTimeMillis()返回的值是从机器的内部时钟获得的。如果系统管理员(或NTP)更改时间,例如,如果发现时钟快速运行5分钟并且系统管理员继续并更正它,System.currentTimeMillis()将受到影响。这意味着您甚至可以看到值减少,如果您使用它来测量间隔,则可以关闭时间。您甚至可以测量否定时间。

另一方面,

System.nanoTime()返回一个从某个内部CPU计数器/时钟得到的值。任何用户或程序都不能更改此时钟测量的时间。这意味着它对于计时更加可靠。但CPU时钟在断电时会重置,因此无法找到当前的“挂钟”时间。