關於Java8 Stream 的使用時機
(/z/programming)
哈哈。的確我寫的太武斷。我當初腦袋中所想的是,問題"可以適合用parallel"就用parallel,但不能說所有問題都適合平行。直接這樣寫確實不太恰當。
那什麼叫做適合parallel?
- 你跑的job要夠長!! 如果跑的東西都是瞬殺,那就直接用sequential跑就好了。
- 可以Split。可能input本身就可以split那最好,如果你中間的某一段開始一分多,例如collectors.groupingBy,那就可以讓後續的aggregation平行做。
- 問題本身適不適合平行。如果你的filter, mapper會有side effect,那就不能平行。reducer有沒有交換律結合律的特性,沒有也不適合平行。
- 輸出需不需要符合原有順序。如果你只是想要stream.map().foreach()。那是不是還想要某個順序執行。
以上幾點都非常重要,很多時候你的東西在沒有parallel是對的,但是丟到平行就錯了。當然如果以上都符合,那用parallel的好處就是善用你的每個CPU Core。看到CPU榨乾才會有滿滿的效能啊!!
另外不一定說要用Stream的平行,也不一定直接用ForkJoinExecutor。用CompletableFuture + Sequencial Stream也可以輕鬆善用CPU Multicore的好處。
這是文章的子討論串,你可以回到上層查看所有討論和文章