如博客文章 小心 Java 中的 System.nanTime ()所述,在 x86系统上,Java 的 System.nanTime ()使用特定于 中央处理器的计数器返回时间值。现在考虑下面的例子,我用它来度量一个呼叫的时间:
long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;
现在在一个多核系统中,可能是在测量时间1之后,线程被调度到一个计数器小于前一个 CPU 计数器的不同处理器。因此我们可以在 time2中得到一个值,它是 更少而不是 time1。因此,我们将得到一个负值的时间花费。
考虑到这种情况,System.nantime 现在是不是已经没什么用了?
我知道改变系统时间不会影响纳米时间。这不是我上面描述的问题。问题在于,每个 CPU 打开后都会保留一个不同的计数器。与第一个 CPU 相比,第二个 CPU 上的这个计数器可以更低。由于操作系统可以在得到 time1之后将线程调度到第二个 CPU,因此 timeSpent 的值可能是不正确的,甚至是负值。