【发布时间】:2010-10-05 08:36:04
【问题描述】:
如博文 Beware of System.nanoTime() in Java 中所述,在 x86 系统上,Java 的 System.nanoTime() 使用 CPU 特定计数器返回时间值。现在考虑以下我用来测量通话时间的案例:
long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;
现在在多核系统中,可能是在测量 time1 之后,线程被调度到另一个处理器,其计数器小于前一个 CPU 的计数器。因此,我们可以在 time2 中得到一个小于 time1 的值。因此我们会在 timeSpent 中得到一个负值。
考虑到这种情况,是不是 System.nanotime 现在几乎没用了?
我知道更改系统时间不会影响纳米时间。这不是我上面描述的问题。问题是每个 CPU 将保持不同的计数器,因为它被打开。与第一个 CPU 相比,第二个 CPU 上的此计数器可能更低。由于线程可以在获取time1后被操作系统调度到第二个CPU,所以timeSpent的值可能不正确,甚至为负数。
【问题讨论】:
-
我没有答案,但我同意你的看法。也许它应该被认为是 JVM 中的一个错误。
-
那个帖子不正确,不使用 TSC 很慢,但你必须忍受:bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440250 TSC 也可以通过管理程序变得有用,但它又变慢了。
-
当然,您可以在虚拟机中运行,其中 CPU 可以在会话中途出现:D