2015-08-06 16 views
13

Quindi la mia domanda è più generale. Ho il seguente codice semplice:Perché c'è una grande differenza di tempo tra la prima chiamata nanoTime() e le chiamate successive?

for(int i=0;i<10;i++){ 
    long starttime=System.nanoTime(); 
    System.out.println("test"); 
    long runtime=System.nanoTime()-starttime; 
    System.out.println(i + ":" +"runtime="+runtime); 
} 

che ricevo il seguente output:?

test 
0:runtime=153956 
test 
1:runtime=15396 
test 
2:runtime=22860 
test 
3:runtime=11197 
test 
4:runtime=11197 
test 
5:runtime=12129 
test 
6:runtime=11663 
test 
7:runtime=11664 
test 
8:runtime=53185 
test 
9:runtime=12130 

Qual è la ragione per la differenza tra il primo e il secondo tempo di esecuzione Grazie in anticipo =)

+1

http://stackoverflow.com/questions/860231/first-time-a-java-loop-is-run-slow-why-sun-hotspot-1-5-sparc Fai riferimento a questa domanda, potrebbe essere d'aiuto . – Sneh

+0

ottimizzazione/previsione forse? + Inizializzazione statica "test" per la prima volta – Hacketo

+3

La JVM utilizza un compilatore JIT che compila il codice byte jvm nel codice macchina reale. Il tempo per la compilazione è contenuto nel primo intervallo. –

risposta

21

Un sacco di cose, sia nella JVM che nella libreria standard, vengono inizializzate pigramente per migliorare il tempo di avvio della JVM. Quindi la prima volta che esegui la linea

System.out.println("test"); 

si verifica un processo di inizializzazione di peso elevato. Il tempo per completarlo è incluso nella tua prima misurazione. Le chiamate successive proseguono lungo il percorso veloce in cui lo stato è già inizializzato.

È possibile osservare lo stesso effetto su moltissime chiamate API in Java.

Naturalmente, ci sono molti altri fattori che possono influenzare il tempo necessario per completare qualsiasi chiamata di metodo, specialmente se include chiamate di sistema sul suo percorso. Tuttavia, il valore anomalo della latenza della prima chiamata 10 è speciale in quanto ha cause deterministiche che ne sono alla base ed è quindi riproducibile in modo affidabile.

4

JVM trascorso qualche tempo l'inizializzazione tutti gli oggetti necessari, l'accesso al sistema di tempo, flusso di uscita del sistema, ecc ... Sono disponibili due metodi che accadono in mezzo:

System.nanoTime() 
System.out.println() 

Ognuno di questi potrebbe aver eseguito un sacco di codice init).

Ogni chiamata successiva è molto più veloce perché è già stata impostata. Pertanto, quando si esegue il benchmarking di un'applicazione per le prestazioni, di solito vengono scartati la fase di riscaldamento e raffreddamento (ad esempio, i primi e gli ultimi 15 minuti).

+0

Amico, questa è la ragione. Impara Java o non impararlo. La nona chiamata potrebbe essere stata più lenta perché, ummmm ... forse qualche altro processo ha usato il tempo della CPU (forse sta scaricando un porno). E la sua domanda era chiara, ha chiesto perché così diverso tra 1 e 2. – darijan

+0

Questo non è vero, come potresti sapere se OP sta scaricando porno OPPURE facendo qualcos'altro o ****. Ma dovresti aggiungere una ragione migliore. A proposito, sono un po 'convinto che sia per questo che ho rimosso il mio downvote. –

+2

Solo Dio sa perché la nona chiamata è stata un po 'più lenta. E questa non è la domanda. Perché la prima chiamata è lenta è perché Java inizializza pigramente materiale, acquisisce maniglie del sistema operativo, ecc ... – darijan

16

Molte cose possono influire sui calcoli.

Che dire di altri processi sulle vostre macchine? Hai considerato la JVM durante il riscaldamento? Forse la garbage collection ? Tutti questi fattori e molti altri portano a questo comportamento.

Se si desidera ottenere risultati "migliori", è necessario eseguirlo per molte più volte e ottenere la media.

Ecco perché è necessario sapere come confrontare le cose in Java, vedere How do I write a correct micro-benchmark in Java?.

+2

@MarkoTopolnik -Io considero questa domanda non solo per la 1a chiamata, ma anche per la nona chiamata. E, quindi, credo che questa sia l'unica risposta che descrive correttamente tutte le cose che * potrebbero * essere in azione. Non considererò solo il primo caso. Dovresti dare risposte per tutte le osservazioni. –

+3

'Se vuoi ottenere risultati" migliori ", devi eseguirlo per molte altre volte e prendere la media. --- Vuoi dire, eseguire lo stesso programma molte volte? OP lo ha fatto e ha notato che, ogni volta, la prima chiamata richiede più tempo. L'unica cosa che questa domanda ha a che fare con il microbenchmarking è che richiede una particolare trappola e la sua causa. –

+2

OP accettato. Quindi sembra essere una risposta.Queste domande non devono essere risolte, sono suggerimenti per OP, e penso che li abbia capiti. – Maroun

Problemi correlati