Suggerimenti sulla scrittura di micro benchmark dai creatori di Java HotSpot :
Regola 0: leggi un documento affidabile su JVM e micro-benchmarking. Una buona è Brian Goetz, 2005 . Non aspettarti troppo dai micro-benchmark; misurano solo una gamma limitata di caratteristiche prestazionali JVM.
Regola 1: includere sempre una fase di riscaldamento che esegua il kernel di test fino in fondo, abbastanza da innescare tutte le inizializzazioni e le compilazioni prima delle fasi di temporizzazione. (Meno iterazioni sono OK nella fase di riscaldamento. La regola empirica è diverse decine di migliaia di iterazioni del ciclo interno.)
Regola 2: eseguire sempre con -XX:+PrintCompilation
, -verbose:gc
ecc., In modo da poter verificare che il compilatore e le altre parti della JVM non stiano eseguendo operazioni impreviste durante la fase di temporizzazione.
Regola 2.1: stampare i messaggi all'inizio e alla fine delle fasi di temporizzazione e riscaldamento, in modo da poter verificare che non vi sia alcun output dalla Regola 2 durante la fase di temporizzazione.
Regola 3: essere consapevoli della differenza tra -client
e -server
, e OSR e compilazioni regolari. La -XX:+PrintCompilation
bandiera riporta compilation OSR con un at-segno per indicare il punto di ingresso non iniziale, per esempio: Trouble$1::run @ 2 (41 bytes)
. Preferisci il server al client e regolarmente all'OSR, se stai cercando le migliori prestazioni.
Regola 4: prestare attenzione agli effetti di inizializzazione. Non stampare per la prima volta durante la fase di temporizzazione, poiché la stampa carica e inizializza le classi. Non caricare nuove classi al di fuori della fase di riscaldamento (o fase di report finale), a meno che non si stia testando il caricamento specifico della classe (e in tal caso caricare solo le classi di test). La Regola 2 è la tua prima linea di difesa contro tali effetti.
Regola 5: essere consapevoli degli effetti di deottimizzazione e ricompilazione. Non prendere alcun percorso di codice per la prima volta nella fase di temporizzazione, poiché il compilatore potrebbe spazzare e ricompilare il codice, sulla base di un precedente presupposto ottimistico che il percorso non sarebbe stato utilizzato affatto. La Regola 2 è la tua prima linea di difesa contro tali effetti.
Regola 6: utilizzare gli strumenti appropriati per leggere la mente del compilatore e aspettarsi di essere sorpresi dal codice che produce. Ispeziona tu stesso il codice prima di formare teorie su ciò che rende qualcosa più veloce o più lento.
Regola 7: ridurre il rumore nelle misurazioni. Esegui il tuo benchmark su una macchina silenziosa ed eseguilo più volte, scartando i valori anomali. Utilizzare -Xbatch
per serializzare il compilatore con l'applicazione e considerare l'impostazione -XX:CICompilerCount=1
per impedire al compilatore di funzionare in parallelo con se stesso. Fai del tuo meglio per ridurre il sovraccarico GC, impostare Xmx
uguali (abbastanza grandi) Xms
e utilizzare UseEpsilonGC
se è disponibile.
Regola 8: utilizzare una libreria per il benchmark poiché è probabilmente più efficiente ed è già stato eseguito il debug per questo unico scopo. Come JMH , Caliper o Bill e Paul's Excellent UCSD Benchmarks for Java .