Java 8, erste Verarbeitung einer Liste ist langsamer als die nachfolgende Verarbeitung

Ich führe einige Tests durch (sehr einfach, nichts Besonderes), um die Leistung von Java 8-Streams und Lambdas zu überprüfen. Verwenden einesArrayList von 10 Millionen POJOS, alles was ich tun möchte, ist den Durchschnittswert eines @ zu bekommBigDecimal Feld. Um mehr als eine Probe zu entnehmen, führe ich den Vorgang fünfmal durch, und zu meiner Überraschung ist der erste dieser fünf Läufe extrem langsamer als der Rest. Beim ersten Mal erhalte ich Werte wie 0,38 Sekunden und bei den anderen vier Werten 0,04 Sekunden. Das ist 10x schneller !!! Den gleichen Test habe ich auch mit Old School @ gemachfor(Pojo p : pojos) mit ähnlichen Ergebnissen. Warum passiert das und wie kann ich es nutzen? Der Code, den ich benutze, ist:

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.");
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage