Consejos sobre cómo escribir micro benchmarks de los creadores de Java HotSpot :
Regla 0: Lea un documento de buena reputación sobre JVM y micro-benchmarking. Uno bueno es Brian Goetz, 2005 . No esperes demasiado de los micro-puntos de referencia; miden solo un rango limitado de características de rendimiento de JVM.
Regla 1: Incluya siempre una fase de calentamiento que ejecute su núcleo de prueba hasta el final, lo suficiente como para activar todas las inicializaciones y compilaciones antes de la (s) fase (s) de temporización. (Menos iteraciones están bien en la fase de calentamiento. La regla general es varias decenas de miles de iteraciones de bucle interno).
Regla 2: Siempre ejecuta con -XX:+PrintCompilation
, -verbose:gc
, etc., para que pueda verificar que el compilador y otras partes de la JVM no están haciendo un trabajo inesperado durante su fase de temporización.
Regla 2.1: Imprima mensajes al principio y al final de las fases de temporización y calentamiento, para que pueda verificar que no haya salida de la Regla 2 durante la fase de temporización.
Regla 3: Tenga en cuenta la diferencia entre -client
y -server
, y OSR y compilaciones regulares. La -XX:+PrintCompilation
bandera informa compilaciones OSR con un signo en para denotar el punto de entrada no inicial, por ejemplo: Trouble$1::run @ 2 (41 bytes)
. Prefiere servidor a cliente y regular a OSR, si buscas el mejor rendimiento.
Regla 4: Tenga en cuenta los efectos de inicialización. No imprima por primera vez durante su fase de temporización, ya que la impresión carga e inicializa las clases. No cargue nuevas clases fuera de la fase de calentamiento (o fase de informe final), a menos que esté probando la carga de clase específicamente (y en ese caso cargue solo las clases de prueba). La regla 2 es su primera línea de defensa contra tales efectos.
Regla 5: Tenga en cuenta los efectos de desoptimización y recompilación. No tome ninguna ruta de código por primera vez en la fase de temporización, porque el compilador puede desechar y volver a compilar el código, en base a una suposición optimista anterior de que la ruta no se iba a utilizar en absoluto. La regla 2 es su primera línea de defensa contra tales efectos.
Regla 6: Use las herramientas apropiadas para leer la mente del compilador y espere ser sorprendido por el código que produce. Inspeccione el código usted mismo antes de formar teorías sobre lo que hace que algo sea más rápido o más lento.
Regla 7: Reduce el ruido en tus medidas. Ejecute su punto de referencia en una máquina silenciosa, y ejecútelo varias veces, descartando valores atípicos. Utilícelo -Xbatch
para serializar el compilador con la aplicación y considere la configuración -XX:CICompilerCount=1
para evitar que el compilador se ejecute en paralelo consigo mismo. Haga todo lo posible para reducir la sobrecarga del GC, establezca Xmx
(lo suficientemente grande) iguales Xms
y utilícelo UseEpsilonGC
si está disponible.
Regla 8: Use una biblioteca para su punto de referencia, ya que probablemente sea más eficiente y ya se haya depurado para este único propósito. Como JMH , Caliper o Bill and Paul's Excellent UCSD Benchmarks para Java .