Ejecuto algunos puntos de referencia a través de JMH
Supongamos que tengo tres puntos de referencia enumerados en un archivo Java
@Benchmark @Threads(value = 2) @Warmup(iterations = 10) @Fork(value = 2) @Measurement(iterations = 10) public String benchmarkA() { ... } @Benchmark @Threads(value = 2) @Warmup(iterations = 10) @Fork(value = 2) @Measurement(iterations = 10) public String benchmarkB() { ... } @Benchmark @Threads(value = 2) @Warmup(iterations = 10) @Fork(value = 2) @Measurement(iterations = 10) public String benchmarkC() { ... }Cada método compara un algoritmo diferente que tiene el mismo propósito. Cuando ejecuto todos los puntos de referencia juntos, los resultados varían en comparación con ejecutar los puntos de referencia uno por uno.
Por ejemplo, ejecute una ejecución JMH con solo un punto de referencia en el archivo Java.
@Benchmark @Threads(value = 2) @Warmup(iterations = 10) @Fork(value = 2) @Measurement(iterations = 10) public String benchmarkA() { ... }Los resultados de este método serían mejores si solo se ejecuta este método; sin embargo, en el caso de más puntos de referencia, los resultados serían peores.
Suponiendo que el resultado sea el punto de referencia A> punto de referencia B> punto de referencia C ejecutándolos de forma aislada, si los ejecuto todos de una vez, las diferencias entre ellos se amplifican.
También intenté cambiar el orden de los puntos de referencia (ejecutados en orden lexicográfico) y los resultados son los mismos. Es como si el número de benchmarks afectara los resultados.
¿Cuál podría ser una razón?
Cada punto de referencia se ejecuta en su propia JVM (a menos que se establezca explícitamente para que se comporte de otra manera), por lo que no debería ocurrir contaminación entre puntos de referencia. Lo que puede suceder, y es bastante común, es el estrangulamiento térmico de su CPU. Si está realizando una evaluación comparativa en un entorno en el que no tiene control sobre la frecuencia de la CPU, el comportamiento típico sería que la primera evaluación comparativa aumentara la frecuencia de la CPU y que las evaluaciones comparativas posteriores se estrangulen. Puede controlar esta variable en entornos Linux cambiando a un regulador de energía controlado por el usuario y configurando una frecuencia fija para su CPU.