2014-06-25 25 views
11

Witam mam pytanie o równoległości podczas korzystania flatmap Rozważmy następujący przykładRównoległość i Flatmap w Java 8 Strumienie

IntStream.of(-1, 1).parallel().flatMap(i->IntStream.range(0,1000).parallel()).forEach(System.out::println); 

Czy to ważne, czy ustawić wewnętrzną flagę równolegle? Wyniki wyglądają bardzo podobnie, jeśli je zostawię, czy nie. Również dlaczego kod (ReferencePipeline) sekwencyjnie mapuje? jestem mylony przez linię:

result.sequential().forEach(downstream); 

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/stream/ReferencePipeline.java#ReferencePipeline.flatMap%28java.util.function.Function%29

+0

Cóż, na podstawie komentarza w kodzie "Możemy zrobić to lepiej; Optymalizuj pod kątem depth = 0 case i po prostu zgarnij spliterator i dla "Yes", zakładam, że nie musieli implementować go jako 'result.sequential(). forEach (downstream)' i mogli użyć równoległego wdrożenia dla lepszej wydajności . – Eran

Odpowiedz

8

W obecnej JDK (jdk1.8.0_25), odpowiedź brzmi nie, to nie ma znaczenia ustawić wewnętrzną flagę równolegle , bo nawet go ustawić z powrotem na .flatMap() wdrażania określony w strumień do sekwencyjnego tutaj:

result.sequential().forEach(downstream); 

("Wynik" jest strumieniem wewnętrznym, a jego dokumentacja: sequential() mówi: Zwraca równoważny strumień sekwencyjny. może zwrócić się, albo ponieważ już strumienia sekwencyjnego, albo dlatego, że leżący u podstaw stan strumień został zmodyfikowany, aby być sekwencyjne)

w większości przypadków może być bez wysiłku aby wewnętrzny strumień równolegle.; jeśli strumień zewnętrzny ma co najmniej taką samą liczbę elementów, co liczba wątków, które mogą działać równolegle (ForkJoinPool.commonPool(). getParallelism() = 3 w moim komputerze).

+0

Nie zgadzam się z ostatnim stwierdzeniem. Jest to prawdą tylko wtedy, gdy obciążenie obliczeniowe na element zewnętrzny jest w przybliżeniu równe. – benehsv

Powiązane problemy