Java 8, первая обработка списка медленнее, чем последующая обработка
Я провожу некоторые тесты (очень простые, ничего особенного), чтобы проверить производительность потоков Java 8 и лямбд. ИспользуяArrayList
из 10 миллионов POJOS, все, что я хочу сделать, это получить среднее значениеBigDecimal
поле. Чтобы взять более одного образца, я запускаю процесс пять раз, и, к моему удивлению, первый из этих пяти запусков происходит намного медленнее, чем остальные. Я получаю значения, как 0,38 секунды в первый раз, и 0,04 секунды на остальных четырех. Это в 10 раз быстрее !!! Я также сделал тот же тест, используя старую школуfor(Pojo p : pojos)
с похожими результатами. Почему это происходит, и как я могу этим воспользоваться? Код, который я использую:
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.");
}