首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.currenTimeInMillis() vs System.nanoTime()

System.currenTimeInMillis() vs System.nanoTime()
EN

Stack Overflow用户
提问于 2012-07-21 17:22:42
回答 3查看 4K关注 0票数 23

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-21 17:28:21

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

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

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

大卫·福尔摩斯的Clocks and Timers - General Overview

由于System.currentTimeMillis()依赖于系统的时间时钟,因此对时间的调整是合法的,以使其保持准时。

这里的调整是什么意思?举个例子,看看Linux对CLOCK_REALTIME的描述:

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

票数 25
EN

Stack Overflow用户

发布于 2012-07-21 17:34:48

只需检查方法的JavaDoc:

System.nanoTime()

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

System.currentTimeMillis()

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

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

票数 8
EN

Stack Overflow用户

发布于 2012-07-21 17:37:54

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11591000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档