2014-06-25 22 views
11

Hallo, ich habe eine Frage zu Parallelität wenn Erwägen Sie die Verwendung flatmap folgendes BeispielParallelism und Flatmap in Java 8 Streams

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

Spielt es eine Rolle, ob ich die innere Flag auf parallel? Die Ergebnisse sehen sehr ähnlich aus, wenn ich es verlasse oder nicht. Auch warum der Code (ReferencePipeline) das Mapping sequenziell? Ich bin von der Linie verwirrt:

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

Nun, basierend auf dem Kommentar im Code 'Wir können das auch besser machen; optimize for depth = 0 case und greifen Sie einfach auf spliterator und forEach it', gehe ich davon aus, dass sie es nicht als 'result.sequential(). forEach (downstream)' implementieren mussten und parallel implementiert haben könnten, um eine bessere Leistung zu erzielen . – Eran

Antwort

8

Im aktuellen JDK (jdk1.8.0_25), die Antwort ist nein, spielt es keine Rolle Sie die innere Flag gesetzt Parallel , denn selbst legen Sie es, die .flatMap() -Implementierung-Set zurück, den Strom zu sequenziellen hier:

result.sequential().forEach(downstream); 

("result" ist der innere Stream und es ist sequential() Doc Doctor sagt: Gibt einen äquivalenten Stream, der sequenziell ist. kann selbst zurückkehren, sei es, weil der Strom bereits sequentielle war, oder weil der zugrunde liegenden Stream Zustand sequentiell sein wurde modifiziert)

In den meisten Fällen gibt keine Mühe sein könnte den inneren Strom parallel zu machen. Wenn der äußere Stream mindestens die gleiche Anzahl von Elementen hat wie die Anzahl der Threads, die parallel ausgeführt werden können (ForkJoinPool.commonPool(). getParallelism() = 3 in meinem Computer).

+0

Ich stimme der letzten Aussage nicht zu. Dies trifft nur zu, wenn die Rechenlast pro äußerem Element ungefähr gleich ist. – benehsv