Оценка Size() для последовательного Spliterator

Я реализую Spliterator что явно ограничивает распараллеливание, имея trySplit() вернуть null, Будет внедрять estimateSize() предложить какие-либо улучшения производительности для потока, созданного этим сплитератором? Или приблизительный размер полезен только для распараллеливания?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я специально спрашиваю о приблизительном размере. Другими словами, мой сплитератор не имеет SIZED характеристика.

2 ответа

Решение

Глядя на иерархию вызовов для соответствующей характеристики сплитератора, выявляется, что она, по крайней мере, актуальна для stream.toArray() спектакль

Кроме того, в реализации внутреннего потока есть эквивалентный флаг, который, кажется, используется для сортировки:

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

Я не требую исчерпывающих результатов для моего поиска, поэтому просто возьмите их в качестве примеров.


Без характеристики SIZED я могу только найти звонки estimateSize() которые имеют отношение к параллельному выполнению потокового конвейера.

Конечно, это может измениться в будущем или другой реализации Stream, чем стандартная JDK, которая могла бы действовать по-другому.

Сплитератор может проходить элементы:

1. Индивидуально ( tryAdvance ())

2. Последовательно навалом ( forEachRemaining ())

Согласно документам Java estimateSize() пригодится при расщеплении.

Сплитераторы могут предоставить оценку количества оставшихся элементов с помощью метода эстимейзинга (). В идеале, как отражено в характеристике SIZED, это значение точно соответствует количеству элементов, которые встретятся при успешном обходе. Однако, даже когда точно не известно, значение оценочного значения может все еще быть полезным для операций, выполняемых над источником, таких как помощь в определении того, является ли предпочтительным разделение дальше или прохождение остальных элементов последовательно.

Так как ваш сплитератор не имеет характеристики SIZED estimateSize не будет предлагать никакой производительности (из-за отсутствия параллелизма), однако имейте в виду, что Java-документы estimateSize ничего не говорится о параллелизме, все, что он заявляет:

Возвращает: предполагаемый размер или Long.MAX_VALUE, если он бесконечен, неизвестен или слишком дорог для вычисления.

Другие вопросы по тегам