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