为了账号安全,请及时绑定邮箱和手机立即绑定

System.NanTime()是完全无用的吗?

System.NanTime()是完全无用的吗?

慕容森 2019-07-16 16:44:09
System.NanTime()是完全无用的吗?如博客文章所记载当心Java中的System.NanTime(),在x86系统上,Java的System.nanTime()使用cpu特定计数器。现在考虑一下用于度量调用时间的以下情况:long time1= System.nanoTime();foo();long time2 = System.nanoTime();long timeSpent = time2-time1;现在,在多核系统中,可能是在测量时间1之后,线程被调度到另一个处理器上,它的计数器比以前的CPU小。因此,我们可以在Time 2中得到一个值,即较少而不是时间1。因此,我们将得到一个负值的时间斯宾特。考虑到这种情况,这不是说System.Nantime现在几乎没用了吗?我知道改变系统时间不会影响纳米时间。这不是我上面描述的问题。问题是每个CPU都会保持一个不同的计数器,因为它是打开的。与第一CPU相比,该计数器在第二CPU上可以更低。由于操作系统可以在获得时间1之后将线程调度到第二个CPU,TimeSpent的值可能是不正确的,甚至是负值。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

我做了一些搜索,发现如果一个人是迂腐的,那么是的,它可能被认为是无用的.在特定情况下.这取决于你的需求对时间的敏感程度.

检查这句话来自JavaSun站点:

实时时钟和System.nanTime()都基于相同的系统调用,因此也基于相同的时钟。

使用JavaRTS,所有基于时间的API(例如定时器、周期线程、截止日期监视等等)都是基于高分辨率定时器的。而且,结合实时优先级,它们可以确保在合适的时间执行适当的代码,以满足实时约束。相比之下,普通的JavaSEAPI只提供了几种能够处理高分辨率时间的方法,而不能保证在给定的时间执行。在代码中的各个点之间使用System.nanTime()来执行经过的时间测量应该始终是准确的。

Java还有一个NanTime()的警告方法:

这种方法只能用于测量经过的时间,而与系统或挂钟时间的任何其他概念无关。返回的值表示某个固定但任意时间的纳秒(可能在将来,因此值可能为负值)。这种方法提供纳秒精度,但不一定是纳秒精度。没有保证价值观变化的频率。持续时间超过292.3年的连续呼叫的差异(2)63由于数值溢出,无法精确计算经过的时间。

似乎唯一可以得出的结论是,不能将NanTime()作为一个精确的值来依赖。因此,如果您不需要测量仅隔纳秒的时间,那么即使结果返回值为负值,此方法也是足够好的。但是,如果您需要更高的精度,它们似乎建议您使用JavaRTS。

所以回答你的问题.没有纳米时间()不是无用的.只是它不是在每一种情况下使用的最谨慎的方法。


查看完整回答
反对 回复 2019-07-16
  • 3 回答
  • 0 关注
  • 430 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信