Java Потоки .max () и .min () отстают в производительности? - PullRequest
1 голос
/ 05 мая 2020

Рассмотрим ниже 2 примера.

1 С потоками

myList.stream().map(this::getInt).max(Integer::compareTo);

2 Старый способ

int max = Integer.MIN_VALUE;
for (MyItem item : myList) {
    max = Math.max(max, getInt(item));    
}

Выше Метод getInt принимает аргумент MyItem и возвращает результат int.

Здесь # 2 дает мне гораздо меньшую задержку по сравнению с # 1. Есть ли у кого-нибудь идеи, почему или что-то у меня идет не так?

Ответы [ 2 ]

4 голосов
/ 05 мая 2020
myList.stream().mapToInt(this::getInt).max()

Попробуйте сопоставить с IntStream. IntStream работает с int внутри, что позволяет избежать накладных расходов на упаковку и распаковку объектов Integer. Кроме того, IntStream.max() не требует специального компаратора.

Итак, вы предполагаете, что основной причиной является «упаковка» и «распаковка»?

Я не знаю, будет ли он соответствовать производительности for l oop, не пройдя тестовый тест. Но это будет улучшение. Если он недостаточно хорош, я предлагаю придерживаться l oop, поскольку я не вижу другого способа его улучшить.

2 голосов
/ 05 мая 2020

Вероятно, вам стоит воспользоваться возможностями Streams, которые должны оптимизировать эти случаи. Прочтите документацию для потоков, в первом примере показан оптимизированный путь для IntStream.

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

     int max = myList.stream()
                      .mapToInt(this::getInt)
                      .max()
                      .orElse(Integer.MIN_VALUE);
...