2014-06-25 14 views
11

Hi Ho una domanda circa il parallelismo quando si utilizza flatmap consideri il seguente esempioparallelismo e Flatmap in Java 8 Streams

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

importa se ho impostato il flag interno in parallelo? I risultati sembrano molto simili se lo lascio lontano o no. Anche perché il codice (ReferencePipeline) sequenziale la mappatura? Sono confuso con la linea:

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

Bene, in base al commento nel codice 'Possiamo fare meglio anche questo; Ottimizza per profondità = 0 caso e prendi semplicemente splitterator e forEach it', sto assumendo che non dovevano implementarlo come 'result.sequential(). forEach (downstream)' e avrebbe potuto usare l'implementazione parallela per prestazioni migliori . – Eran

risposta

8

Nel JDK corrente (jdk1.8.0_25), la risposta è no, non importa si imposta il flag interno parallelo , perché anche lo si imposta, di nuovo il .flatMap() del set di esecuzione del flusso di sequenziale qui:

result.sequential().forEach(downstream); 

("risultato" è lo stream interno ed è il documento del metodo sequential(): Restituisce un flusso equivalente sequenziale. si possono trasferire, o perché il flusso era già sequenziale, o perché lo stato flusso sottostante è stato modificato per essere sequenziale)

Nella maggior parte dei casi ci potrebbe essere nessuno sforzo per rendere il flusso interno parallelo.; se il flusso esterno ha almeno lo stesso numero di elementi del numero di thread che possono essere eseguiti parallelamente (ForkJoinPool.commonPool(). getParallelism() = 3 nel mio computer).

+0

Sono leggermente in disaccordo con l'ultima affermazione. È vero solo se il carico di calcolo per elemento esterno è approssimativamente uguale. – benehsv