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 回答
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
实时时钟和System.nanTime()都基于相同的系统调用,因此也基于相同的时钟。
使用JavaRTS,所有基于时间的API(例如定时器、周期线程、截止日期监视等等)都是基于高分辨率定时器的。而且,结合实时优先级,它们可以确保在合适的时间执行适当的代码,以满足实时约束。相比之下,普通的JavaSEAPI只提供了几种能够处理高分辨率时间的方法,而不能保证在给定的时间执行。在代码中的各个点之间使用System.nanTime()来执行经过的时间测量应该始终是准确的。
这种方法只能用于测量经过的时间,而与系统或挂钟时间的任何其他概念无关。返回的值表示某个固定但任意时间的纳秒(可能在将来,因此值可能为负值)。这种方法提供纳秒精度,但不一定是纳秒精度。没有保证价值观变化的频率。持续时间超过292.3年的连续呼叫的差异(2) 63由于数值溢出,无法精确计算经过的时间。
- 3 回答
- 0 关注
- 497 浏览
添加回答
举报
0/150
提交
取消