在說到並行的時候,相信不少人都會想到併發的概念。那麼並行和併發二者一字之差,有什麼區別呢?數組
並行:多個任務在同一時間點發生,並由不一樣的cpu進行處理,不互相搶佔資源數據結構
並行:併發
併發:多個任務在同一時間點內同時發生了,但由同一個cpu進行處理,互相搶佔資源框架
併發:性能
當在大量數據處理上,數據並行化能夠大量縮短任務的執行時間,將一個數據分解成多個部分,而後並行處理,最 後將多個結果彙總,獲得最終結果。測試
對於並行流,其在底層實現中,是沿用了Java7提供的fork/join分解合併框架進行實現。fork根據cpu核數進行數 據分塊,join對各個fork進行合併。實現過程以下所示:對象
對於並行流,必定不要陷入一個誤區:並行必定比串行快。並行在不一樣的狀況下它不必定是比串行快的。影響並行 流性能主要存在5個因素:blog
1)數據大小:輸入數據的大小,直接影響了並行處理的性能。由於在並行內部實現中涉及到了fork/join操做,它 自己就存在性能上的開銷。所以只有當數據量很大,使用並行處理纔有意義。資源
2)源數據結構:fork時會對源數據進行分割,數據源的特性直接影響了fork的性能。 ArrayList、數組或IntStream.range,可分解性最佳,由於他們都支持隨機讀取,所以能夠被任意分割。 HashSet、TreeSet,可分解性通常,其雖然可被分解,但由於其內部數據結構,很難被平均分解。 LinkedList、Streams.iterate、BufferedReader.lines,可分解性極差,由於他們長度未知,沒法肯定在哪裏進行 分割。it
3)裝箱拆箱 儘可能使用基本數據類型,避免裝箱拆箱。
4)CPU核數 fork的產生數量是與可用CPU核數相關,可用的核數越多,獲取的性能提高就會越大。
5)單元處理開銷 花在流中每一個元素的時間越長,並行操做帶來的性能提高就會越明顯。
1)基本類型
性能消耗: Stream串行>for循環>Stream並行
2)對象
性能消耗:Stream串行>for循環>Stream並行
3)複雜對象
性能消耗:for循環>Stream串行>Stream並行
結論:對於簡單操做,若是環境機是多核的話,建議使用Stream並行,同時在不考慮核數的狀況 下,普通for循環性能要明顯高於Stream串行,相差兩倍左右。 對於複雜操做,推薦使用Stream API操做。