SlideShare a Scribd company logo
Мифы и легенды
Древней Греции
Java Stream API
Зураб Белый
Рексофт 2016
Не верьте мне.
Проверяйте всё сами.
Дисклеймер
Миф №1: “Stream API только для
коллекций”
Stream из коллекций
Collection objects = ...;
objects.stream();
objects.parallelStream();
Stream из массивов
int[] array = new int[0];
Arrays.stream(array);
Stream из строк
"Тут могла быть ваша реклама".chars();
Pattern
.compile("^[0-9]+[А-Яа-я]{2}")
.splitAsStream("Тут тоже могла быть
ваша реклама");
Stream из vararg
Stream.of(object);
Stream.of(object1, object2, object3, object4);
Stream.builder().add(object1).add(object2).build()
;
Генераторы стримов
Stream.iterate(0, i -> i++);
Stream.generate(() -> Math.random() % 123);
Stream из потоков и файлов
Files.lines("/usr/local/java/tutorial.txt")
;
Reader reader = ...;
new BufferedReader(reader).lines();
new JarFile("pokmeonOG.jar").stream();
Stream повсюду...
new Random().ints();
new BitSet().stream();
Миф №1: “Stream API только для
коллекций”
Тестовый стенд
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Warmup(iterations = 20)
@Measurement(iterations = 30)
@OperationsPerInvocation(1000)
@Fork(10)
Миф №2: “Stream быстрее цикла”
@Benchmark
public List<String> loop(List<String> strings) {
List<String> newStrings = new ArrayList<>();
for (String str : strings) {
if (str.indexOf("1") > 3) {
newStrings.add(
str.toUpperCase().substring(0, 3)
);
}
}
return newStrings;
}
@Benchmark
public List<String> stream(List<String> strings) {
return strings
.stream()
.filter(str -> str.indexOf("1") > 3)
.map(str ->
str.toUpperCase().substring(0, 3))
.collect(Collectors.toList());
}
Benchmark | Items |Samples| Score|Score error|Units
----------|-------|-------|------|-----------|-----
loop |100 000| 300|10,376| 0,063|µs/op
----------|-------|-------|------|-----------|-----
stream |100 000| 300|10,582| 0,074|µs/op
@Benchmark
public List<String> stream(List<String> strings)
{
return strings
.stream()
.parallel()
.filter(str -> str.indexOf("1") > 3)
.map(str ->
str.toUpperCase().substring(0,
3))
.collect(Collectors.toList());
}
Benchmark | Items |Samples| Score|Score error|Units
----------|-------|-------|------|-----------|-----
loop |100 000| 300|10,376| 0,063|µs/op
----------|-------|-------|------|-----------|-----
stream |100 000| 300|10,582| 0,074|µs/op
----------|-------|-------|------|-----------|-----
parallel |100 000| 300| 3,423| 0,097|µs/op
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код
можно добавлением .parallel()”
Мифы и легенды Java Stream API
java.util.Iterator<E>
java.util.Iterator<E>
java.util.Spliterator<T>
java.util.Spliterator<T>
java.util.Spliterator<T>
@Benchmark
public List<String> top10Users(List<User> users) {
return users
.stream()
// .parallel()
.distinct()
.sorted()
.limit(10)
.map(Objects::toString)
.collect(Collectors.toList());
}
public class User implements Comparable {
private long id, count;
...
public boolean equals(Object o) {
if (this == o) return true;
else if (!(o instanceof User)) return false;
else return id == ((User) o).id;
}
public int compareTo(Object o) {
long count2 = ((User) o).getCount();
if (count > count2) return 1;
else if (count == count2) return 0;
else return -1
}
}
Benchmark | Items|Samples| Score |Score error|Units
----------|-------|-------|---------|-----------|-----
simple |100 000| 300| 82,199| 0,728|us/op
----------|-------|-------|---------|-----------|-----
parallel |100 000| 300| 53,882| 0,294|us/op
.distinct() .sorted() .limit() .collect() ...
java.util.Spliterator<T>
Benchmark | Items|Samples| Score |Score error|Units
----------|-------|-------|---------|-----------|-----
simple |100 000| 300| 82,199| 0,728|us/op
----------|-------|-------|---------|-----------|-----
parallel |100 000| 300| 53,882| 0,294|us/op
----------|-------|-------|---------|-----------|-----
simple | 100| 300| 0,033| 0,000|us/op
----------|-------|-------|---------|-----------|-----
parallel | 100| 300| 0,105| 0,002|us/op
Benchmark | Items|Samples| Score |Score error|Units
----------|-------|-------|---------|-----------|-----
simple |100 000| 300| 82,199| 0,728|us/op
----------|-------|-------|---------|-----------|-----
parallel |100 000| 300| 53,882| 0,294|us/op
----------|-------|-------|---------|-----------|-----
simple | 100| 300| 0,033| 0,000|us/op
----------|-------|-------|---------|-----------|-----
parallel | 100| 300| 0,105| 0,002|us/op
----------|-------|-------|---------|-----------|-----
simple | 10m| 300|15731,075| 337,593|us/op
----------|-------|-------|---------|-----------|-----
parallel | 10m| 300|17065,969| 596,584|us/op
Миф №3: “Оптимизировать код
можно добавлением .parallel()”
Миф №4: “Класс источника стрима
прямо не влияет на скорость”
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
ORDERED
DISTINCT
SORTED
SIZED
NONNULL
IMMUTABLE
CONCURRENT
SUBSIZED
java.util.Spliterator<T>. Характеристики
Мифы и легенды Java Stream API
Benchmark | Items|Samples| Score|Score error|Units
----------|-------|-------|-------|-----------|-----
simple |100 000| 300| 0,005| 0,000|us/op
----------|-------|-------|-------|-----------|-----
parallel |100 000| 300| 0,850| 0,009|us/op
Benchmark | Items|Samples| Score|Score error|Units
----------|-------|-------|-------|-----------|-----
simple |100 000| 300| 82,199| 0,728|us/op
----------|-------|-------|-------|-----------|-----
parallel |100 000| 300| 53,882| 0,294|us/op
Миф №4: “Класс источника стрима
прямо не влияет на скорость”
Миф №5: “Параллельный стрим
выполняет лишние операции”
Stream
.of(1, 2, 3, 4, 5, 6)
.map(i -> {
System.out.println("Map " + i);
return i;
})
.filter(i -> {
System.out.println("Filter " + i);
return true;
})
.limit(3)
.forEach(i -> System.out.println("ForEach " +
i));
Map 1
Filter 1
ForEach 1
Map 2
Filter 2
ForEach 2
Map 3
Filter 3
ForEach 3
Обычный стрим
Map 1
Map 3
Map 4
Map 2
Filter 4
Filter 3
Filter 1
Filter 2
Map 5
Map 6
Map 1
Filter 1
ForEach 1
Map 2
Filter 2
ForEach 2
Map 3
Filter 3
ForEach 3
Filter 5
Filter 6
ForEach 1
ForEach 3
ForEach 2
Обычный стрим Параллельный стрим
Миф №5: “Параллельный стрим
выполняет лишние операции”
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
Миф №1: “Stream API только для коллекций”
Миф №2: “Stream быстрее цикла”
Миф №3: “Оптимизировать код можно добавлением .parallel()”
Миф №4: “Класс источника стрима прямо не влияет на скорость”
Миф №5: “Параллельный стрим выполняет лишние операции”
Итог
Спасибо за внимание!
Вопросы?
@ZurabBelyi
BelyiZ

More Related Content

What's hot (20)

PDF
Мир Python функционалим с помощью библиотек
PyNSK
 
PDF
DevConf. Дмитрий Сошников - ECMAScript 6
Dmitry Soshnikov
 
PDF
Игорь Лабутин «Коллекционируем данные в .NET»
SpbDotNet Community
 
ODP
Charming python sc2-8
Vladislav Ananev
 
PDF
8 встреча — Язык программирования Python (В. Ананьев)
Smolensk Computer Science Club
 
PDF
Живые приложения с Rx
GoSharp
 
PDF
Функционально декларативный дизайн на C++
Alexander Granin
 
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Ontico
 
PDF
Распространённые ошибки оценки производительности .NET-приложений
Mikhail Shcherbakov
 
PDF
Something about Golang
Anton Arhipov
 
PDF
Scala on android
Valeriya Atamanova
 
PDF
Об особенностях использования значимых типов в .NET
Andrey Akinshin
 
PDF
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
PPT
Производительность в Django
MoscowDjango
 
PDF
msumobi2. Лекция 2
Глеб Тарасов
 
PDF
Оптимизация производительности Python
PyNSK
 
PDF
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Yandex
 
PDF
Pyton – пробуем функциональный стиль
Python Meetup
 
PDF
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
 
Мир Python функционалим с помощью библиотек
PyNSK
 
DevConf. Дмитрий Сошников - ECMAScript 6
Dmitry Soshnikov
 
Игорь Лабутин «Коллекционируем данные в .NET»
SpbDotNet Community
 
Charming python sc2-8
Vladislav Ananev
 
8 встреча — Язык программирования Python (В. Ананьев)
Smolensk Computer Science Club
 
Живые приложения с Rx
GoSharp
 
Функционально декларативный дизайн на C++
Alexander Granin
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Ontico
 
Распространённые ошибки оценки производительности .NET-приложений
Mikhail Shcherbakov
 
Something about Golang
Anton Arhipov
 
Scala on android
Valeriya Atamanova
 
Об особенностях использования значимых типов в .NET
Andrey Akinshin
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
Производительность в Django
MoscowDjango
 
msumobi2. Лекция 2
Глеб Тарасов
 
Оптимизация производительности Python
PyNSK
 
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Yandex
 
Pyton – пробуем функциональный стиль
Python Meetup
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
 

More from CEE-SEC(R) (20)

PPTX
Подбор и адаптация методологий разработки ПО под различные типы производствен...
CEE-SEC(R)
 
PDF
Проектный офис и аналитик
CEE-SEC(R)
 
PDF
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
CEE-SEC(R)
 
PDF
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
CEE-SEC(R)
 
PDF
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
CEE-SEC(R)
 
PPTX
«Знак качества» как инструмент анализа восприятия продукта клиентами
CEE-SEC(R)
 
PPTX
Машинное обучение на каждый день
CEE-SEC(R)
 
PPTX
Process и Case Management в информационной системе:
CEE-SEC(R)
 
PPTX
Проблемы процесса разработки с точки зрения тестирования
CEE-SEC(R)
 
PDF
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
CEE-SEC(R)
 
PPTX
Ай-трекинг в UX исследованиях
CEE-SEC(R)
 
PDF
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
CEE-SEC(R)
 
PDF
Технологичный подход к повышению продуктивности – кейсы и исследования
CEE-SEC(R)
 
PPT
Субъектно-ориентированные информационные системы на предприятиях
CEE-SEC(R)
 
PDF
Шаблоны контейнеров в Virtuozzo
CEE-SEC(R)
 
PPTX
Apache Storm: от простого приложения до подробностей реализации
CEE-SEC(R)
 
ODP
Семантическое ядро рунета
CEE-SEC(R)
 
PPTX
Разработка требований для противоречащих законодательств
CEE-SEC(R)
 
PDF
IT-Лаборатория: кузница кадров и стартапов
CEE-SEC(R)
 
PPTX
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
CEE-SEC(R)
 
Подбор и адаптация методологий разработки ПО под различные типы производствен...
CEE-SEC(R)
 
Проектный офис и аналитик
CEE-SEC(R)
 
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
CEE-SEC(R)
 
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
CEE-SEC(R)
 
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
CEE-SEC(R)
 
«Знак качества» как инструмент анализа восприятия продукта клиентами
CEE-SEC(R)
 
Машинное обучение на каждый день
CEE-SEC(R)
 
Process и Case Management в информационной системе:
CEE-SEC(R)
 
Проблемы процесса разработки с точки зрения тестирования
CEE-SEC(R)
 
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
CEE-SEC(R)
 
Ай-трекинг в UX исследованиях
CEE-SEC(R)
 
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
CEE-SEC(R)
 
Технологичный подход к повышению продуктивности – кейсы и исследования
CEE-SEC(R)
 
Субъектно-ориентированные информационные системы на предприятиях
CEE-SEC(R)
 
Шаблоны контейнеров в Virtuozzo
CEE-SEC(R)
 
Apache Storm: от простого приложения до подробностей реализации
CEE-SEC(R)
 
Семантическое ядро рунета
CEE-SEC(R)
 
Разработка требований для противоречащих законодательств
CEE-SEC(R)
 
IT-Лаборатория: кузница кадров и стартапов
CEE-SEC(R)
 
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
CEE-SEC(R)
 
Ad

Мифы и легенды Java Stream API

Editor's Notes

  • #4: Голосование Кто знает другие применения?
  • #14: ГОЛОСОВАНИЕ