Java 8, o primeiro processamento de uma lista é mais lento que o processamento subsequente
Estou executando alguns testes (muito básicos, nada sofisticados) para verificar o desempenho nos fluxos e lambdas do Java 8. Usando umArrayList
de 10 milhões de POJOS, tudo o que eu quero fazer é obter o valor médio de umBigDecimal
campo. Para coletar mais de uma amostra, eu executo o processo cinco vezes e, para minha surpresa, a primeira dessas cinco execuções é extremamente mais lenta que as demais. Estou recebendo valores como 0,38 segundos na primeira vez e 0,04 segundos nas outras quatro. Isso é 10x mais rápido !!! Eu também fiz o mesmo teste usando a velha escolafor(Pojo p : pojos)
com resultados semelhantes. Por que isso está acontecendo e como posso tirar proveito disso? O código que estou usando é:
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.");
}