Java 17 (lanzado ayer) viene con muchas características nuevas y mejoras. Sin embargo, la mayoría de ellos requieren cambios de código para beneficiarse. Excepto por el rendimiento. Simplemente cambie su instalación de JDK y obtendrá un aumento de rendimiento gratuito. ¿Pero cuanto? ¿Vale la pena? Averigüemos comparando los puntos de referencia de JDK 17, JDK 16 y JDK 11.
Metodología de referencia
- Hardware: Una máquina estable sin otros procesos exigentes computacionales en ejecución y con
yIntel® Xeon® Silver 4116 @ 2.1 GHz (12 cores total / 24 threads)memoria RAM, corriendo128 GiB.RHEL 8 x86_64
- JDK (utilizados para compilar y ejecutar):
- JDK 11openjdk 11.0.12 2021-07-20 Entorno de tiempo de ejecución OpenJDK Temurin-11.0.12 + 7 (compilación 11.0.12 + 7) OpenJDK 64-Bit Server VM Temurin-11.0.12 + 7 (compilación 11.0.12 + 7, modo mixto)
- JDK 16openjdk 16.0.2 2021-07-20 Entorno de tiempo de ejecución OpenJDK (compilación 16.0.2 + 7-67) VM de servidor OpenJDK de 64 bits (compilación 16.0.2 + 7-67, modo mixto, uso compartido)
- JDK 17 (descargado 2021-09-06)openjdk 17 2021-09-14 Entorno de tiempo de ejecución OpenJDK (compilación 17 + 35-2724) VM de servidor OpenJDK de 64 bits (compilación 17 + 35-2724, modo mixto, uso compartido)
- Opciones de JVM:
y especifique explícitamente un recolector de basura:-Xmx3840M
-
para G1GC, el recolector de basura de baja latencia (el predeterminado en los tres JDK).-XX:+UseG1GC
-
para ParallelGC, el recolector de basura de alto rendimiento.-XX:+UseParallelGC
-
- Clase principal:
del móduloorg.optaplanner.examples.app.GeneralOptaPlannerBenchmarkAppen OptaPlanneroptaplanner-examples.8.10.0.Final
- Cada ejecución resuelve 11 problemas de planificación con OptaPlanner, como la lista de empleados , los horarios escolares y la optimización de la nube . Cada problema de planificación dura 5 minutos. El registro está configurado en
. El punto de referencia comienza con un calentamiento de JVM de 30 segundos que se descarta.INFO
- Resolver un problema de planificación no implica E / S (excepto unos pocos milisegundos durante el inicio para cargar la entrada). Una sola CPU está completamente saturada. Crea constantemente muchos objetos de corta duración y el GC los recopila posteriormente.
- Los puntos de referencia miden el número de puntuaciones calculadas por segundo. Más alto es mejor. Calcular una puntuación para una solución de planificación propuesta no es trivial: implica muchos cálculos, incluida la verificación de conflictos entre cada entidad y todas las demás entidades.
- Cada ejecución resuelve 11 problemas de planificación con OptaPlanner, como la lista de empleados , los horarios escolares y la optimización de la nube . Cada problema de planificación dura 5 minutos. El registro está configurado en
- Ejecuciones: cada combinación de JDK y recolector de basura se ejecuta 3 veces de forma secuencial. Los resultados a continuación son el promedio de esas 3 carreras.
Resultados
Java 11 (LTS) y Java 16 frente a Java 17 (LTS)
Promedio | Equilibrio de la nube | Reasignación de máquina | Programación de cursos | Programación de exámenes | Lista de enfermeras | Torneo itinerante | ||||||
Conjunto de datos | 200c | 800c | B1 | B10 | c7 | c8 | s2 | s3 | m1 | mh1 | nl14 | |
JDK 11 | 103,606 | 96,700 | 274,103 | 37,421 | 11,779 | 13,660 | 14.354 | 8,982 | 3,585 | 3.335 | 5,019 | |
JDK 16 | 109,203 | 97.567 | 243,096 | 38,031 | 13,950 | 16,251 | 15,218 | 9.528 | 3.817 | 3,508 | 5.472 | |
JDK 17 | 106,147 | 98,069 | 245,645 | 42,096 | 14,406 | 16,924 | 15,619 | 9,726 | 3.802 | 3.601 | 5.618 | |
11 → 17 | 8,66% | 2,45% | 1,42% | -10,38% | 12,49% | 22,30% | 23,90% | 8,81% | 8,28% | 6,05% | 7,98% | 11,95% |
16 → 17 | 2,41% | -2,80% | 0,51% | 1,05% | 10,69% | 3,27% | 4,14% | 2,63% | 2,08% | -0,39% | 2,65% | 2,67% |
Promedio | Equilibrio de la nube | Reasignación de máquina | Programación de cursos | Programación de exámenes | Lista de enfermeras | Torneo itinerante | ||||||
Conjunto de datos | 200c | 800c | B1 | B10 | c7 | c8 | s2 | s3 | m1 | mh1 | nl14 | |
JDK 11 | 128,553 | 121,974 | 292,761 | 48,339 | 13,397 | 15,540 | 16,392 | 9,887 | 4.409 | 4.148 | 6.097 | |
JDK 16 | 128,723 | 123,314 | 281,882 | 45,622 | 16,243 | 18,528 | 17,742 | 10,744 | 4.608 | 4.348 | 6.578 | |
JDK 17 | 130,215 | 124,498 | 262,753 | 45,058 | 16,479 | 18,904 | 18.023 | 10,845 | 4.658 | 4.430 | 6.641 | |
11 → 17 | 6,54% | 1,29% | 2,07% | -10,25% | -6,79% | 23,00% | 21,64% | 9,95% | 9,68% | 5,63% | 6,80% | 8,92% |
16 → 17 | 0,37% | 1,16% | 0,96% | -6,79% | -1,24% | 1,45% | 2,03% | 1,59% | 0,94% | 1,08% | 1,89% | 0,96% |
Nota | Al observar los datos sin procesar de las 3 ejecuciones individuales (no se muestran aquí), los números de reasignación de máquina (B1 y B10) fluctúan mucho entre las ejecuciones en el mismo JDK y GC. A menudo en más del 10%. Los otros números no sufren esta falta de fiabilidad.Podría decirse que es mejor ignorar los números de reasignación de máquina . Pero para evitar preocupaciones sobre los datos selectivos, estos resultados y promedios los incluyen. |
G1GC frente a ParallelGC en Java 17
Promedio | Equilibrio de la nube | Reasignación de máquina | Programación de cursos | Programación de exámenes | Lista de enfermeras . | Torneo itinerante | ||||||
Conjunto de datos | 200c | 800c | B1 | B10 | c7 | c8 | s2 | s3 | m1 | mh1 | nl14 | |
G1GC | 106,147 | 98,069 | 245,645 | 42,096 | 14,406 | 16,924 | 15,619 | 9,726 | 3.802 | 3.601 | 5.618 | |
Paralelo GC | 130,215 | 124,498 | 262,753 | 45,058 | 16,479 | 18,904 | 18.023 | 10,845 | 4.658 | 4.430 | 6.641 | |
G1 → Paralelo GC | 16,39% | 22,67% | 26,95% | 6,96% | 7,04% | 14,39% | 11,69% | 15,39% | 11,50% | 22,50% | 23,01% | 18,20% |
Resumen ejecutivo
En promedio, para los casos de uso de OptaPlanner, estos puntos de referencia indican que:
- Java 17 es un 8,66% más rápido que Java 11 y un 2,41% más rápido que Java 16 para G1GC (predeterminado).
- Java 17 es un 6,54% más rápido que Java 11 y un 0,37% más rápido que Java 16 para ParallelGC.
- El recolector de basura paralelo es un 16,39% más rápido que el recolector de basura G1.
No hay grandes sorpresas aquí: el último JDK es más rápido y el recolector de basura de alto rendimiento es más rápido que el recolector de basura de baja latencia.
Espera un minuto aquí …
Cuando comparamos JDK 15 , vimos que Java 15 era un 11,24% más rápido que Java 11. Ahora, la ganancia de Java 17 sobre Java 11 es menor. ¿Eso significa que Java 17 es más lento que Java 15?
Bueno no. Java 17 también es más rápido que Java 15. Esos puntos de referencia anteriores se ejecutaron en una base de código diferente (OptaPlanner 7.44 en lugar de 8.10). No compare manzanas y naranjas.