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