Почему я получаю отрицательное прошедшее время, используя System.nanoTime ()? - PullRequest
15 голосов
/ 23 октября 2011

Я пытаюсь использовать следующий код с 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)

1 Ответ

14 голосов
/ 23 октября 2011

nanoTime может быть взято из счетчика тактовых циклов ЦП. Поскольку разные процессоры могут запускаться в разное время, счетчик тактовых импульсов может быть разным на разных процессорах. Linux исправляет это, но старые версии Windows этого не делают. (Я предполагаю, что у вас есть два процессора, которые были запущены с интервалом в 3 мс)

Вы также должны иногда видеть положительные скачки более 2,5 мс.

Попробуйте

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

И вы должны увидеть некоторые скачки вперед и некоторые назад, когда процесс переключается между процессорами.

...