为什么使用System.nanoTime()获得消极的经过时间?

我正在尝试使用以下代码System.nanoTime()来测量代码的经过时间。

public static void main(String[] args) throws Exception {

while (true) {

long start = System.nanoTime();

for (int i = 0; i < 10000; i++)

;

long end = System.nanoTime();

long cost = end - start;

if (cost < 0) {

System.out.println("start: " + start + ", end: " + end + ", cost: " + cost);

}

}

}

我得到这样的结果:

start: 34571588742886, end: 34571585695366, cost: -3047520

start: 34571590239323, end: 34571586847711, cost: -3391612

start: 34571651240343, end: 34571648928369, cost: -2311974

start: 34571684937094, end: 34571681543134, cost: -3393960

start: 34571791867954, end: 34571788878081, cost: -2989873

start: 34571838733068, end: 34571835464021, cost: -3269047

start: 34571869993665, end: 34571866950949, cost: -3042716

start: 34571963747021, end: 34571960656216, cost: -3090805

start: 34571965020545, end: 34571961637608, cost: -3382937

start: 34572010616580, end: 34572007613257, cost: -3003323

为什么我得到负值?

(作业系统:Windows XP SP3,Java:jdk1.6u27)

回答:

可以将nanoTime用作CPU时钟周期计数器。由于可以在略微不同的时间启动不同的CPU,因此不同的CPU上的时钟计数器也可以不同。Linux对此进行了纠正,但是Windows的较早版本没有。(我假设您有两个CPU,每个CPU的间隔为3

ms)

您还应该偶尔看到超过2.5毫秒的正跳。

尝试

if (cost < 0 || cost > 2000000) {

随着进程在CPU之间切换,您应该看到一些向前跳转和向后跳转。

以上是 为什么使用System.nanoTime()获得消极的经过时间? 的全部内容, 来源链接: utcz.com/qa/424474.html

回到顶部