這是文章的子討論串,你可以回到上層查看所有討論和文章
popcorny 積分 0

可以用parallel當然用parallel,這樣才可以利用到Multicore的好處。

IngramChen 積分 1

不,完全要 benchmark 過才可以用,真的能用的地方不多。

popcorny 積分 5 編輯於

哈哈。的確我寫的太武斷。我當初腦袋中所想的是,問題"可以適合用parallel"就用parallel,但不能說所有問題都適合平行。直接這樣寫確實不太恰當。

那什麼叫做適合parallel?

  1. 你跑的job要夠長!! 如果跑的東西都是瞬殺,那就直接用sequential跑就好了。
  2. 可以Split。可能input本身就可以split那最好,如果你中間的某一段開始一分多,例如collectors.groupingBy,那就可以讓後續的aggregation平行做。
  3. 問題本身適不適合平行。如果你的filter, mapper會有side effect,那就不能平行。reducer有沒有交換律結合律的特性,沒有也不適合平行。
  4. 輸出需不需要符合原有順序。如果你只是想要stream.map().foreach()。那是不是還想要某個順序執行。

以上幾點都非常重要,很多時候你的東西在沒有parallel是對的,但是丟到平行就錯了。當然如果以上都符合,那用parallel的好處就是善用你的每個CPU Core。看到CPU榨乾才會有滿滿的效能啊!!

另外不一定說要用Stream的平行,也不一定直接用ForkJoinExecutor。用CompletableFuture + Sequencial Stream也可以輕鬆善用CPU Multicore的好處。

howie 積分 0

恩我看到文章是很多地方雖然可以parallel但是會被content switch...等問提把好處都消耗光~所以真的很難說...