System.currenTimeInMillis()vs System.nanoTime()

Gee*_*eek 23 java

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

Kon*_*che 25

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

如果您对测量绝对时间感兴趣,请随时使用 System.currentTimeMillis().请注意,它的分辨率可能非常粗糙(尽管绝对时间这个问题很少出现.)

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

时钟和计时器 - David Holmes 概述

由于System.currentTimeMillis()是依托系统一天中的时间时钟,调整时间是合理的,以保持它的时间.

这里有什么调整?例如,看看CLOCK_REALTIMELinux 的描述:

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


Jir*_*era 8

只需检查方法的JavaDoc:

System.nanoTime()

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

System.currentTimeMillis()

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

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


Jon*_*oni 6

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

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