讀Java實戰(第二版)筆記15_並行數據處理與性能

来源:https://www.cnblogs.com/lying7/archive/2023/02/20/17122433.html
-Advertisement-
Play Games

實踐環境 Odoo 14.0-20221212 (Community Edition) 代碼實現 在js腳本函數中調用模型中自定義方法: this._rpc({ model: 'demo.wizard', // 模型名稱,即模型類定義中 _name 的值 method: 'action_select ...


1. Stream

1.1. 允許你聲明性地將順序流轉變成並行流

1.2. 能對這些集合執行操作流水線,可以充分利用電腦的多個核

2. 並行流

2.1. 把內容拆分成多個數據塊,用不同線程分別處理每個數據塊的流

2.2. 自動地把工作負荷分配到多核處理器的所有核

2.3. 內部迭代讓你可以並行處理一個流,而無須在代碼中顯式使用和協調不同的線程

2.4. 對順序流調用parallel方法,你可以將流轉換成並行流

2.5. 並行流調用sequential方法就可以把它變成順序流

2.6. 最後一次parallel或sequential調用會影響整個流水線

2.7. 內部使用了預設的ForkJoinPool

2.7.1. 預設的線程數量就是你的處理器數量

2.7.2. Runtime.getRuntime().availableProcessors()得到

2.7.3. java.util.concurrent.ForkJoinPool.common.parallelism來修改線程池大小

3. Java微基準套件

3.1. Java microbenchmark harness, JMH

3.2. 一個以聲明方式幫助大家創建簡單、可靠微基準測試的工具集

3.3. 支持Java

3.4. 支持可以運行在Java虛擬機(Java virtual machine, JVM)上的其他語言

3.5. 選擇適當的數據結構往往比並行化演算法更重要

3.5.1. LongStream.rangeClosed

3.6. 並行軟體的行為和性能有時是違反直覺的,因此一定要測量,確保你並沒有把程式拖得更慢

4. 並行化的代價

4.1. 並行化過程本身需要對流做遞歸劃分

4.2. 把每個子流的歸約操作分配到不同的線程

4.3. 然後把這些操作的結果合併成一個值

4.4. 多個核之間移動數據的代價也可能比你想的要大

4.4.1. 保證在核中並行執行工作的時間比在核之間傳輸數據的時間長

4.5. 很多情況下不可能或不方便並行化

4.5.1. 如果結果錯了,算得快就毫無意義了

5. 高效使用並行流

5.1. 適用於要處理的元素數量龐大,或處理單個元素特別耗時的時候

5.2. 並行流並不總是比順序流快

5.2.1. 用適當的基準來檢查其性能

5.3. 自動裝箱和拆箱操作會大大降低性能

5.4. 有些操作本身在並行流上的性能就比順序流差

5.4.1. limit和findFirst等依賴於元素順序的操作

5.4.2. findAny會比findFirst性能好,因為它不一定要按順序來執行

5.5. 調用unordered方法來把有序流變成無序流

5.5.1. 對無序並行流調用limit可能會比單個有序流(比如數據源是一個List)更高效

5.6. 流的操作流水線的總計算成本

5.6.1. 設N是要處理的元素的總數,Q是一個元素通過流水線的大致處理成本,則N*Q就是這個對成本的一個粗略的定性估計

5.6.2. Q值較高就意味著使用並行流時性能好的可能性比較大

5.7. 對於較小的數據量,選擇並行流幾乎從來都不是一個好的決定

5.8. 流背後的數據結構是否易於分解

5.8.1. ArrayList的拆分效率比LinkedList高得多

5.9. 終端操作中合併步驟的代價是大是小

6. 分支/合併框架

6.1. 分治演算法的並行版本

6.2. 以遞歸方式將可以並行的任務拆分成更小的任務,然後將每個子任務的結果合併起來生成整體結果

6.3. ExecutorService介面的一個實現,它把子任務分配給線程池(稱為ForkJoinPool)中的工作線程

6.4. 對一個任務調用join方法會阻塞調用方,直到該任務做出結果

6.5. 不應該在RecursiveTask內部使用ForkJoinPool的invoke方法

6.6. 應該始終直接調用compute或fork方法,只有順序代碼才應該用invoke來啟動並行計算

6.7. 對子任務調用fork方法可以把它排進ForkJoinPool

6.8. 工作竊取

6.8.1. 隨機選了一個別的線程,從隊列的尾巴上“偷走”一個任務

7. Spliterator

7.1. 一種自動機制來為你拆分流

7.2. 代表“可分迭代器”(splitable iterator)

7.3. 用於遍曆數據源中的元素,但它是為了並行執行而設計的

7.4. 特性是通過characteristics方法聲明的

7.5. Java沒有元組(tuple,用來表示由異類元素組成的有序列表的結構,不需要包裝對象),所以你必須創建一個新類來把狀態封裝起來


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼要提升<報警有效性> 過多的報警會讓負責人麻木 過多的報警會增加簡訊和電話的成本 提升根因定位效率 如何定義<報警有效性> 不漏報 不誤報 不重報 不延報 如何量化 MTTF (Mean Time To Failure,平均無故障時間):平均正常運行時間 MTTR (Mean Time To ...
  • 大家好,我是良許,新年快樂呀~ 在我女室友堅持不懈的努力之下,2022年的最後一天我終於被她傳染了,陽了~ 此時的我,正頂著37多度的低燒寫下這篇年終總結。 2022年,對於大多數人而言,封控是主旋律——不停地核酸,不停地居家。特別是對於做實體行業的小伙伴,真的是損失慘重。 我在廣州租住的地方有個步 ...
  • 效果圖 隨著輸入的文本自動增加高度,鍵盤上方自定義菜單佈局,隨鍵盤彈起 點擊編輯框,自動滾動到焦點處輸入 佈局層次 <ConstraintLayout> <ScrollView> <LinearLayout> <Edittext/> <自定義佈局/> </LinearLayout> </Scroll ...
  • require.js是一個js腳本載入器(模塊化載入),它遵循AMD(Asynchronous Module Definition)規範,實現js腳本的非同步載入,不阻塞頁面的渲染和其後的腳本的執行,並提供了在載入完成之後的執行相應回調函數的功能。官網下載地址:https://requirejs.or ...
  • 項目背景 最近在準備開發工作流引擎相關模塊,完成表結構設計後開始著手流程設計器的技術選型,調研了眾多開源項目後決定基於jsplumb.js開源庫進行自研開發,保證定製化的便捷性,相關效果圖及項目地址如下 項目地址:https://gitee.com/code2roc/fast-flow-desgio ...
  • ES6的模塊化設計思想是靜態化,也就是說,在編譯的時候確定模塊的依賴關係,以及輸出輸出入的變數。而CommonJS和AMD模塊都是在運行時確定的。ES6的模塊不是對象,而是通過export顯示指定輸出的代碼,再通過import命令輸入。 // 模塊輸入 import { start,address ...
  • Cesium中的entities可以隨時間變化長度高度,主要依賴於CallbackProperty函數。 因為使用CallbackProperty,cesium中一切可視化的要素都可以與時間聯繫起來。 定義:new Cesium.CallbackProperty (callback, isConst ...
  • 實踐環境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下圖,列表網倉記錄詳情頁面(form視圖),編輯內聯視圖中的貨主記錄,為貨主和倉庫欄位搜索,添加過濾條件,具體如下: 添加、編輯貨主時,下拉列表中只展示選取和當網倉記錄所屬公司關聯的貨主,點擊搜索更多 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...