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

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的值可能是不正确的,甚至是负值。


慕容森
浏览 432回答 3
3回答

绝地无双

我做了一些搜索,发现如果一个人是迂腐的,那么是的,它可能被认为是无用的.在特定情况下.这取决于你的需求对时间的敏感程度.检查这句话来自JavaSun站点:实时时钟和System.nanTime()都基于相同的系统调用,因此也基于相同的时钟。使用JavaRTS,所有基于时间的API(例如定时器、周期线程、截止日期监视等等)都是基于高分辨率定时器的。而且,结合实时优先级,它们可以确保在合适的时间执行适当的代码,以满足实时约束。相比之下,普通的JavaSEAPI只提供了几种能够处理高分辨率时间的方法,而不能保证在给定的时间执行。在代码中的各个点之间使用System.nanTime()来执行经过的时间测量应该始终是准确的。Java还有一个NanTime()的警告方法:这种方法只能用于测量经过的时间,而与系统或挂钟时间的任何其他概念无关。返回的值表示某个固定但任意时间的纳秒(可能在将来,因此值可能为负值)。这种方法提供纳秒精度,但不一定是纳秒精度。没有保证价值观变化的频率。持续时间超过292.3年的连续呼叫的差异(2)63由于数值溢出,无法精确计算经过的时间。似乎唯一可以得出的结论是,不能将NanTime()作为一个精确的值来依赖。因此,如果您不需要测量仅隔纳秒的时间,那么即使结果返回值为负值,此方法也是足够好的。但是,如果您需要更高的精度,它们似乎建议您使用JavaRTS。所以回答你的问题.没有纳米时间()不是无用的.只是它不是在每一种情况下使用的最谨慎的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java