Как IntStream избежать скрытых затрат на бокс - PullRequest
1 голос
/ 01 июня 2019

Когда у вас есть

Stream.of(1 ,10).reduce(0,(v1, v2) -> v1 + v2);

против

IntStream.of(1 ,10).reduce(0,(v1, v2) -> v1 + v2);

Как работает `IntStream?избежать скрытых расходов на бокс?

А почему бокс стоит с точки зрения производительности?

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

IntStream - это специализация Stream<T>, которая обрабатывает int primitive значения.

Посмотрите на IntStream интерфейс:

IntStream filter(IntPredicate predicate);
IntStream map(IntUnaryOperator mapper);
...

Вы можете видеть, что этот интерфейс использует только int primitive специализированную версию Predicate, Function, Consumer ... поэтому для работы с int не требуется бокс (поскольку он работает напрямую с int)

О стоимости производительности автобокса вы можете обратиться к java guide :

Нельзя использовать автобокс и распаковку для научных вычислений или другой чувствительный к производительности цифровой код

Это потому, что каждый раз, когда вы вызываете операцию, требуется либо int или Integer, либо помещение int в контейнер Integer, компилятор вводит для вас вызов метода box / unbox.

Производительность довольно незначительна для обычных операций, но если у вас интенсивные циклы или критичные по времени строки кода, вам следует избегать автобоксирования.

1 голос
/ 01 июня 2019

Еще одно дополнение к последствиям бокса: это не только прямое наказание за различные дополнительные вызовы методов.

Имейте в виду, что часть бокса приводит к созданию новых объектов. Несомненно, поскольку создание объектов является частой операцией в ООП, эта операция очень оптимизирована. Но все же: требуется время для извлечения памяти для нового объекта, и его конструктор и все остальные шаги инициализации должны быть запущены. Это в основном складывает. И что еще хуже: когда вы делаете это в больших масштабах, вы возлагаете значительную нагрузку на сборщик мусора.

(Я помню, что давным-давно здесь был задан вопрос, когда ОП спросил, почему его приложение демонстрирует чрезвычайно высокую активность GC. Оказалось, что он делал какой-то большой цикл, где он помещал значения int в объекты Integer, просто чтобы отбросить объекты спустя мгновение. Просто избежание этого бокса значительно улучшило общие характеристики производительности его приложения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...