Stream並行流詳解

我是七月呀發表於2020-12-24

1、並行與併發的區別

在說到並行的時候,相信很多人都會想到併發的概念。那麼並行和併發兩者一字之差,有什麼區別呢?

並行:多個任務在同一時間點發生,並由不同的cpu進行處理,不互相搶佔資源

並行:

併發:多個任務在同一時間點內同時發生了,但由同一個cpu進行處理,互相搶佔資源

併發:

當在大量資料處理上,資料並行化可以大量縮短任務的執行時間,將一個資料分解成多個部分,然後並行處理,最 後將多個結果彙總,得到最終結果。

2、並行流原理介紹

對於並行流,其在底層實現中,是沿用了Java7提供的fork/join分解合併框架進行實現。fork根據cpu核數進行數 據分塊,join對各個fork進行合併。實現過程如下所示:

3、影響並行流效能主要存在5個因素

對於並行流,一定不要陷入一個誤區:並行一定比序列快。並行在不同的情況下它不一定是比序列快的。影響並行 流效能主要存在5個因素:

1)資料大小:輸入資料的大小,直接影響了並行處理的效能。因為在並行內部實現中涉及到了fork/join操作,它 本身就存在效能上的開銷。因此只有當資料量很大,使用並行處理才有意義。

2)源資料結構:fork時會對源資料進行分割,資料來源的特性直接影響了fork的效能。 ArrayList、陣列或IntStream.range,可分解性最佳,因為他們都支援隨機讀取,因此可以被任意分割。 HashSet、TreeSet,可分解性一般,其雖然可被分解,但因為其內部資料結構,很難被平均分解。 LinkedList、Streams.iterate、BufferedReader.lines,可分解性極差,因為他們長度未知,無法確定在哪裡進行 分割。

3)裝箱拆箱 儘量使用基本資料型別,避免裝箱拆箱。

4)CPU核數 fork的產生數量是與可用CPU核數相關,可用的核數越多,獲取的效能提升就會越大。

5)單元處理開銷 花在流中每個元素的時間越長,並行操作帶來的效能提升就會越明顯。

4、測試總結

1)基本型別

效能消耗: Stream序列>for迴圈>Stream並行

2)物件

效能消耗:Stream序列>for迴圈>Stream並行

3)複雜物件

效能消耗:for迴圈>Stream序列>Stream並行

結論:對於簡單操作,如果環境機是多核的話,建議使用Stream並行,同時在不考慮核數的情況 下,普通for迴圈效能要明顯高於Stream序列,相差兩倍左右。 對於複雜操作,推薦使用Stream API操作。

相關文章