2012-07-21 42 views
23

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

+0

我很好奇。如果您尝试使用'currentTimeInMillis()'记录夏时制转换期间的经过时间,会发生什么?或者那不是什么意思? – 2012-07-21 09:37:54

+3

什么'currentTimeMillis'试图衡量的是作为一种物理现象的时间流。 DST转变与您旅行时的时区变化类似:它只影响时间以小时和分钟表示;时间本身不受影响。 – Joni 2012-07-21 09:45:26

+2

'currentTimeMillis'不受例如DST,但它受到例如不像'nanoTime'那样。 – 2012-07-21 10:20:08

回答

25

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

如果您有兴趣测量绝对时间然后一直使用 System.currentTimeMillis()。要知道,它的分辨率可能相当 粗(虽然这是很少的绝对时间的问题。)

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

Clocks and Timers - General Overview大卫·霍姆斯

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

这是什么意思?以Linux为例说明CLOCK_REALTIME

测量真实(即挂钟)时间的系统时钟。 设置此时钟需要适当的权限。这个时钟是 在系统时间受到不连续的跳跃(例如,如果 系统管理员手动改变时钟),并且通过的adjtime(3)和NTP进行 增量调整。

+0

这是来自您提供的链接“相对时间时钟由System.nanoTime()方法表示,它返回”自由运行“时间(以纳秒为单位)。”为什么它称为“自由运行”时间? – Geek 2012-07-21 10:41:26

+0

@Geek我会说免费的,在*独立*的手段。绝对时间取决于操作系统触发的中断。相对*自由运行*时间与此无关,正如Joni Salonen指出的那样,由内部CPU时钟定时器产生。 – 2012-07-21 10:49:13

+0

“系统通常同时具有绝对时钟(日时钟,低分辨率)和相对时钟(可计算”自由运行“时间的某种”高分辨率“计数器) 。为什么一天中的时钟分辨率较低,相对分辨率较高? – Geek 2012-07-21 11:00:26

8

只是检查的方法中的Javadoc:

System.nanoTime()

” ......这种方法只能用于测量经过时间和不相关的系统或任何其他概念墙上时钟时间...... “

System.currentTimeMillis()

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

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

4

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

System.nanoTime()另一方面返回从一些内部CPU计数器/时钟派生的值。这个时钟测量的时间不能被任何用户或程序改变。这意味着它将更加可靠的时机。但CPU时钟在关闭时重置,因此对于查找当前“挂钟”时间没有用处。

相关问题