Java 8, el primer procesamiento de una lista es más lento que el procesamiento posterior
Estoy ejecutando algunas pruebas (muy básicas, nada lujosas) para verificar el rendimiento en las transmisiones y lambdas de Java 8. Usando unArrayList
de 10 millones de POJOS, todo lo que quiero hacer es obtener el valor promedio de unBigDecimal
campo. Para tomar más de una muestra, ejecuto el proceso cinco veces, y para mi sorpresa, la primera de esas cinco ejecuciones es extremadamente más lenta que el resto. Obtengo valores como 0,38 segundos la primera vez y 0,04 segundos en los otros cuatro. ¡Esto es 10 veces más rápido! También hice la misma prueba usando la vieja escuelafor(Pojo p : pojos)
con resultados similares ¿Por qué sucede esto y cómo puedo aprovecharlo? El código que estoy usando es:
for (int i = 0; i < 5; i++) {
long init = System.nanoTime();
BigDecimal sum = lista.parallelStream().map(x -> x.getCosto()).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal avg = sum.divide(BigDecimal.valueOf(registros));
long end = System.nanoTime();
System.out.println("End of processing: " + avg + " in "
+ ((end - init) / 1000000000.0) + " seconds.");
}