java8函數式編程數據並行化<三>

數據並行化是指將數據分紅塊,爲每塊數據分配單獨的處理單元。《java8函數式編程》書中拿馬拉車那個例子打比方,就像從車裏取出一些貨物,放到另外一輛車上,兩輛馬車都沿着一樣的路徑到達目的地,書中畫的圖也是很容易理解,後面也copy了很多原句。java

當須要在大量數據上執行一樣的操做時,數據並行化很管用。它將問題分解爲可在多塊數 據上求解的形式,而後對每塊數據執行運算,最後將各數據塊上獲得的結果彙總,從而獲 得最終答案。這個描述還有點像分治法,或者歸併排序。編程

若是已經有一個 Stream 對象,調用它的 parallel 方法就能讓其擁有並行操做的能力。若是想從一個集合類建立一個流,調用 parallelStream 就能當即得到一個擁有並行能力的流,使用起來很簡單,只要改動一個方法,其餘都是同樣的,沒必要理會串行仍是並行,只要告訴程序怎麼作就好了,畢竟告訴計算機作什麼和怎麼作是兩回事。數組

併發化數組操做數據結構

可是有人會問串行和並行哪個快?這就要看具體的環境要求了,主要影響因素以下:併發

數據大小:只有數據足夠大、每一個數據處理管道花費的時間足夠多 時,並行化處理纔有意義。框架

源數據結構:每一個管道的操做都基於一些初始數據源,一般是集合。函數式編程

裝箱 處理基本類型比處理裝箱類型要快。函數

核的數量:在實踐中,核的數量不單指你的機器上有多少核,更是指運行時 你的機器能使用多少核。這也就是說同時運行的其餘進程,或者線程關聯性(強制線程 在某些核或 CPU 上運行)會影響性能。性能

單元處理開銷:花在流中 每一個元素身上的時間越長,並行操做帶來的性能提高越明顯。線程

書中描述了在底層,並行流沿用了fork/join框架(其實我理解不了)。fork遞歸式地分解問題,而後每段並行執行,最終由join合併結果,返回最後的值(書中畫了一個圖)。

將核心類庫提供的通用數據結構分紅如下三組:

性能好:ArrayList、數組或 IntStream.range,這些數據結構支持隨機讀取,也就是說它們能輕 而易舉地被任意分解。

性能通常:HashSet、TreeSet,這些數據結構不易公平地被分解,可是大多數時候分解是可能的。

性能差:有些數據結構難於分解,好比,可能要花 O(N) 的時間複雜度來分解問題。其中包括 LinkedList,對半分解太難了。還有 Streams.iterate 和 BufferedReader.lines,它們 長度未知,所以很難預測該在哪裏分解。

一入Stream有點迷惘,具體這個性能怎麼樣,還要繼續摸索。

相關文章
相關標籤/搜索