JMH è una soluzione Java per la creazione, la gestione e l’analisi di benchmark scritti in Java e in altri linguaggi rivolti alla JVM (e.g. Scala, etc.). JMH è l’acronimo di Java Microbenchmark Harness ed è un toolkit che aiuta a implementare correttamente dei microbenchmark Java.
JMH
JMH è una soluzione Java per la creazione, la gestione e l’analisi di benchmark scritti in Java e in altri linguaggi rivolti alla JVM (e.g. Scala, etc.). JMH è l’acronimo di Java Microbenchmark Harness ed è un toolkit che aiuta a implementare correttamente dei microbenchmark Java per la misura delle performance. JMH è sviluppato dalle stesse persone che hanno implementato la Java Virtual Machine, di conseguenza hanno una esperienza ed una conoscenza dell’architettura completa ed esauriente.
Scrivere benchmark che misurino correttamente le prestazioni di una piccola parte di un’applicazione più grande è molto difficile. Esistono molte ottimizzazioni che la JVM o l’hardware sottostante possono applicare al componente quando il benchmark esegue quel componente in isolamento. Queste ottimizzazioni potrebbero non essere applicabili quando il componente è in esecuzione come parte di un’applicazione più grande. I microbenchmarks mal implementati possono quindi far credere che le prestazioni del tuo componente siano migliori di quelle che saranno poi nella realtà. La scrittura di un microbenchmark Java corretto in genere comporta la prevenzione delle ottimizzazioni che la JVM e l’hardware potrebbero applicare durante l’esecuzione di microbenchmark che non potevano essere applicate in un sistema di produzione reale. Questo è ciò che JMH può aiutare ad ottenere.
JMH Benchmark Modes
JMH può eseguire i benchmarks in modalità differenti (benchmark mode). Il benchmark mode serve a JMH per sapere cosa misurare. I benchmark mode sono i seguenti:
Throughput | Misura il numero di operazioni per secondo, cioè il numero di volte per secondo che il metodo in esame può essere eseguito. |
Average Time | Misura il tempo medio di esecuzione del benchmark (a single execution). |
Sample Time | Misura quanto tempo impiega il metodo per essere eseguito, includendo delle statistiche come la media, il massimo, il minimo, i percentili, distribuzione intorno alla media e gli istogrammi. |
Single Shot Time | Misura quanto tempo impiega un singolo benchmark per essere eseguito. Questa modalità è utile per testare un benchmark con una partenza a freddo (cold start, senza warmup della JVM). |
All | Tutte le misure precedenti. |
Il benchmark mode di default è Throughput.
L’analisi con JHM prevede la conoscenza approfondita del codice sorgente.
Sono disponibili su GitHub alcuni esempi di codice di utilizzo della libreria JMH:
COMMENTS