2011-10-23 15 views
15

Sto cercando di utilizzare il seguente codice con System.nanoTime() per misurare il tempo trascorso del codice.Perché ricevo un tempo trascorso negativo utilizzando 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); 
     } 
    } 
} 

E ottengo questo risultato:

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 

Perché ottengo valori negativi?

(OS: Windows XP SP3, java: jdk1.6u27)

+4

non può riprodurre su Linux con Java (TM) SE Runtime Environment (build 1.6.0_26-b03). Ad ogni modo, perché ti lamenti? Quando Java era lento negli anni '90 la gente si lamentava, ora è * troppo veloce *, e la gente si lamenta ancora :-) – stivlo

+1

Protesta? Non riesco a trovare un modo corretto per misurare il tempo di esecuzione del codice. Niente a che vedere con veloce o lento. – Freewind

+2

correlati: http://stackoverflow.com/questions/3274892/why-is-my-system-nanotime-broken – stivlo

risposta

14

Il nanoTime può essere presa del contatore di cicli di clock della CPU. Dato che diverse CPU possono essere avviate in tempi leggermente diversi, il contatore di clock può essere diverso su diverse CPU. Linux lo corregge, ma le versioni precedenti di Windows no. (Immagino tu abbia due CPU che sono state avviate a distanza di 3 ms)

Occasionalmente si dovrebbero vedere anche salti positivi di oltre 2,5 ms.

Prova

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

E si dovrebbe vedere qualche salto in avanti e qualche salto all'indietro come il processo viene commutata tra le CPU.

+0

Hai perfettamente ragione. Nuovi risultati: -3494855, 4185715, -3562463, 3620073, 4175502, 3977789, -3500977, 4125248 – Freewind

+0

Mi aspetterei che sia quasi alternato. Dove c'è un risultato positivo molto grande il processo potrebbe essere fermato e riavviato sulla stessa CPU. –

Problemi correlati