摘要:限制編寫并行流,存在一些與非并行流不一樣的約定。底層框架并行流在底層沿用的框架,遞歸式的分解問題,然后每段并行執行,最終由合并結果,返回最后的值。
本書第六章的讀書筆記,也是我這個系列的最后一篇讀書筆記。后面7、8、9章分別講的“測試、調試與重構”、“設計和架構的原則”以及“使用Lambda表達式編寫并發程序”,因為筆記不好整理,就不寫了,感興趣的同學自己買書來看吧。
并行化流操作關于并行與并發的區別和并行的重要性的討論這里不做筆記了,直接看Stream類庫提供了哪些關于并行的操作把。
如果已經有了一個Stream對象,可以調用parallel方法使其擁有并行操作的能力;
如果想從一個集合類創建一個Stream對象,可以調用parallelStream方法獲得一個擁有并行能力的流。
BaseStream提供的sequential方法將會按順序遍歷Stream中的元素
對于同一個Stream對象,如果parallel方法和sequential方法都被調用,最后調用的那個方法將起效,不能同時處于兩種模式。
使用并行流,不需要寫代碼用于處理調度和等待線程池中的某項任務完成,這些工作都交由類庫完成。
限制編寫并行流,存在一些與非并行流不一樣的約定。
reduce方法的限制 初值必須為組合函數的恒等值使用恒等值與其他值做reduce運算時,其他值保持不變。比如,使用reduce進行求和運算時,初值必須為0,而進行求積運算時,初值必須為1
reduce操作必須符合結合律因為并行計算時,元素的遍歷順序是不確定的,所以只有符合結合律才能保證結果是確定的。
避免持有鎖前面提到過,并行流的操作,是把線程的調度等工作交給了類庫解決的,所以不要做持有鎖的操作,否則是自找麻煩
性能 主要影響因素影響并行流的性能的因素主要有5個:
數據大小
因為并行處理會帶來分解數據和合并數據的額外開銷,所以只有當數據量足夠大時使用并行流操作才具有意義,否則就是在浪費資源。
源數據結構
源數據通常是集合,而因為具體的類型不同,造成了分割時的開銷不同。
裝箱
基本數據類型比裝箱類型處理更快。
核的數量
擁有的核數量越多,潛在的性能提升越大。但這里的核是指運行時進程能夠使用的核的數量。
單元處理開銷
花在每個元素上的處理時間越長,并行帶來的性能提升越大。
底層框架并行流在底層沿用的fork/join框架,fork遞歸式的分解問題,然后每段并行執行,最終由join合并結果,返回最后的值。
數據結構分解的難易數據結構對半分解的難易程度,決定了分解的效率。可以將核心類庫提供的通用數據結構分為三類:
性能好
ArrayList、數組或者IntStream.range這樣的支持隨機讀取的結構,能夠輕易的分解。
性能一般
HashSet、TreeSet這樣的數據結構不易公平的分解。
性能差
有的數據結構難于分解,有的結構可能需要花O(N)的時間復雜度來分解。比如:LinkedList,難以對半分解;Streams.iterate和BufferedRead.lines這樣長度未知的數據結構也難以分解。
操作的狀態流中的操作,可以分為有狀態和無狀態。無狀態的操作在整個操作中不必維護狀態;有狀態的操作則有維護狀態所需的開銷和限制。
避開有狀態的操作,可以獲得更好的并行性能。無狀態的操作包括map、filter和flatMap;有狀態的操作包括sorted、distinct和limit。
并行化數組操作Java 8為數組提供了并行化操作的方法,這些方法在Arrays類中:
method | description |
---|---|
parallelPrefix | 任意給定一個函數,計算數組的“和”(任意BinaryOperator) |
parallelSetAll | 使用Lambda表達式更新數組元素 |
parallelSort | 并行化對數組元素排序 |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66672.html
摘要:但是,最好使用差異化的類型定義,函數簽名如下其實二者說的是同一件事。后者的返回值和初始函數的返回值相同,即。破壞式更新和函數式更新的比較三的延遲計算的設計者們在將引入時采取了比較特殊的方式。四匹配模式語言中暫時并未提供這一特性,略。 一、無處不在的函數 一等函數:能夠像普通變量一樣使用的函數稱為一等函數(first-class function)通過::操作符,你可以創建一個方法引用,...
摘要:第四章引入流一什么是流流是的新成員,它允許你以聲明性方式處理數據集合通過查詢語句來表達,而不是臨時編寫一個實現。 第四章 引入流 一、什么是流 流是Java API的新成員,它允許你以聲明性方式處理數據集合(通過查詢語句來表達,而不是臨時編寫一個實現)。就現在來說,你可以把它們看成遍歷數據集的高級迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼。 下面兩段代碼都是用來返回低...
摘要:內部迭代與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進行的。流只能遍歷一次請注意,和迭代器類似,流只能遍歷一次。 流(Stream) 流是什么 流是Java API的新成員,它允許你以聲明性方式處理數據集合(通過查詢語句來表達,而不是臨時編寫一個實現)。就現在來說,你可以把它們看成遍歷數據集的高級迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼了!我會在后面的筆記中...
摘要:新特性總覽標簽本文主要介紹的新特性,包括表達式方法引用流默認方法組合式異步編程新的時間,等等各個方面。還有對應的和類型的函數連接字符串廣義的歸約匯總起始值,映射方法,二元結合二元結合。使用并行流時要注意避免共享可變狀態。 Java8新特性總覽 標簽: java [TOC] 本文主要介紹 Java 8 的新特性,包括 Lambda 表達式、方法引用、流(Stream API)、默認方...
摘要:本文是函數式編程第三章的讀書筆記,章名為流。正確使用表達式明確要達成什么轉化,而不是說明如何轉化沒有副作用只通過函數的返回值就能充分理解函數的全部作用函數不會修改程序或外界的狀態獲取值而不是變量避免使用數組逃過的追殺,應該考慮優化邏輯 本文是「Java 8 函數式編程」第三章的讀書筆記,章名為流。本章主要介紹了外部迭代與內部迭代以及常用的高階函數。 外部迭代與內部迭代 外部迭代 過去我...
閱讀 3084·2021-09-22 15:20
閱讀 2607·2019-08-30 15:54
閱讀 1971·2019-08-30 14:06
閱讀 3120·2019-08-30 13:05
閱讀 2462·2019-08-29 18:36
閱讀 575·2019-08-29 15:10
閱讀 529·2019-08-29 11:17
閱讀 825·2019-08-28 18:11