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