讀Java性能權威指南(第2版)筆記03_ Java SE API技巧中

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

1. 緩衝I/O 1.1. 對於文件和套接字,壓縮和字元串編碼的操作,必須適當地對I/O進行緩衝 1.1.1. 兩個流操作的是位元組塊(來自緩衝流)而不是一系列的單位元組(來自ObjectOutputStream),它們會運行得更好 1.2. InputStream.read() 1.3. Output ...


1. 緩衝I/O

1.1. 對於文件和套接字,壓縮和字元串編碼的操作,必須適當地對I/O進行緩衝

1.1.1. 兩個流操作的是位元組塊(來自緩衝流)而不是一系列的單位元組(來自ObjectOutputStream),它們會運行得更好

1.2. InputStream.read()

1.3. OutputStream.write()

1.4. 操作的是單個字元

1.5. FileInputStream.read()

1.6. FileInputStream.write()

1.7. 

1.8. 二進位數據的文件I/O

1.8.1. BufferedInputStream或BufferedOutputStream來包裝底層的文件流

1.9. 使用字元(字元串)數據的文件I/O

1.9.1. BufferedReader或BufferedWriter來包裝底層的流

1.10. ByteArrayInputStream類和ByteArrayOutputStream類

1.10.1. 用緩衝過濾流包裝它們,意味著數據會被覆制兩次

1.10.1.1. 被覆制到過濾流的緩衝區

1.10.1.2. 被覆制到ByteArrayInputStream的緩衝區

1.10.1.3. 輸出流也是如此

1.10.2. 在沒有其他流參與的時候,應該避免緩衝I/O

1.11. GZIPOutputStream

1.11.1. 操作數據塊比操作單位元組數據更高效

1.12. ObjectOutputStream

1.12.1. 將單位元組數據發送到下一個流

1.12.2. 下一個流是最終目的地

1.12.2.1. ByteArrayOutputStream,則無須緩衝

1.12.2.2. 中間有另一個過濾流,如GZIPOutputStream,有必要緩衝

2. 隨機數

2.1. java.util.Random

2.1.1. 主要操作(nextGaussian()方法)是同步的

2.1.2. 鎖上都會產生競爭

2.2. java.util.concurrent.ThreadLocalRandom

2.2.1. 當每個線程都有自己的隨機數生成器時,Random類的同步就不再是問題

2.3. 偽隨機演算法

2.3.1. 確定性的

2.3.1.1. 並不能真正做到隨機

2.3.2. 通過特定生成器查看這個數字序列,並最終算出下一個數字會是什麼

2.4. java.security.SecureRandom

2.4.1. 使用一個系統介面來為其隨機數據獲取種子

2.4.2. 提供的數據基於真正的隨機事件(如滑鼠的移動)

2.4.3. 基於熵的隨機性(entropy-based randomness)

2.4.3.1. 更安全

2.4.4. generateSeed()方法花費的時間無法確定,這取決於系統有多少未使用的熵

2.4.4.1. 性能本身變成了隨機

2.4.4.2. 更好的解決方案是設置操作系統,使其提供更多的熵,這可以通過運行rngd守護進程來實現

2.4.5. SecureRandom類的阻塞問題可以通過修改配置來避免,但最好在操作系統層面通過給系統增加熵來解決

3. 類數據共用

3.1. Java 11

3.2. class data sharing,CDS

3.2.1. JVM之間共用類元數據的一種機制

3.2.2. 可以縮短JVM的啟動時間

3.3. 只適用於從模塊或JAR文件載入的類,不能共用(或加速載入)來自文件系統或網路URL的類

3.4. 常規的CDS(共用預設的JDK類)

3.5. 應用程式類數據共用

3.5.1. 可以共用任何一組類

3.6. XX:+DumpLoadedClassList=filename標誌來運行你的應用程式

3.6.1. 將(在filename文件中)生成一個列表,其中包含你的應用程式已經載入的所有類

3.7. 使用這個類列表來生成共用存檔

$ java -Xshare:dump -XX:SharedClassListFile=filename \
    -XX:SharedArchiveFile=myclasses.jsa \
    ……類路徑參數……

3.8. 使用共用存檔來運行應用程式

$ java -Xshare:auto -XX:SharedArchiveFile=myclasses.jsa ……其他參數……

3.9. 要驗證類是否從共用存檔載入,可以在命令行加上類載入日誌(-Xlog:class+load=info)命令

4. Java原生介面

4.1. (Java Native Interface,JNI)

4.2. 想要真正快速的代碼,應該使用原生代碼

4.3. 編寫儘可能快的代碼感興趣,應該避免使用Java原生介面

4.4. 某個應用程式是用Java編寫的,那麼出於性能原因調用原生代碼幾乎總是一個壞主意

4.4.1. JNI並不能解決性能問題

4.4.2. Java代碼幾乎總是比調用原生代碼運行得更快

4.5. 儘可能避免從Java到C的調用

4.5.1. 從C調用回Java不會有很大的性能損失(取決於所涉及的參數)

4.5.2. 當使用JNI時,要限制從Java到C的調用次數,跨越JNI邊界的調用開銷很大

4.6. 參數不是基本類型,那麼JNI代碼會表現得更差

4.7. 要讓固定數組和字元串的時間儘可能短

4.7.1. 垃圾回收器才不會受到影響


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

-Advertisement-
Play Games
更多相關文章
  • 一、IDEA連接本地MySQL 點擊IDEA右側欄Database 在Data Sources中選擇MySQL (host 欄localhost port 欄 3306 user欄 root【資料庫用戶名】 password欄 root【資料庫密碼】 database欄 可填可不填) 填完後先點擊左 ...
  • Redis事務定義 Redis 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。 Redis 事務的主要作用就是串聯多個命令防止別的命令插隊。 Multi、Exec、discard Redis 事務中有 Multi、Ex ...
  • 1. 需求:我們現在需要寫一個 foo 函數,這個函數返迴首次調用時的 Date 對象,註意是首次。 使用場景:當我們每次都需要進行條件判斷,其實只需要判斷一次,接下來的使用方式都不會發生改變的時候,想想是否可以考慮使用惰性函數。 惰性函數:顧名思義,有點懶惰,懶到事件只處理一次,當然不是值整個函數 ...
  • 本章將繼續和大家分享Vue的一些基礎知識。話不多說,下麵我們直接上代碼: 本文內容大部分摘自Vue的官網:https://v2.cn.vuejs.org/v2/guide/ 首先我們先來看一下Demo的目錄結構,如下所示: 一、偵聽器 <!DOCTYPE html> <html lang="en"> ...
  • 在ES6中新增了一個很重要的特性: class(類)。作為一個在2015年就出了的特性, 相信很多小伙伴對class並不陌生。但是在日常開發中使用class的頻率感覺並不高(可能僅限於作者),感覺對class總有種一知半解的感覺。今天就帶著小伙伴們一起,好好剖析剖析這個特性。 1.什麼是class ...
  • ———————————————— 版權聲明:本文為CSDN博主「LW0512」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/LW0512/article/details/120287699 ...
  • 常用API API概述 API全稱是應用程式編程介面,是Java寫好的程式,程式員可以直接調用。 Object類:toString方法 Object是祖宗類,它裡面的方法,一切子類對象都可以使用。 public String toString() 預設是返回當前對象的地址信息。 Student s ...
  • 跨平臺開發框架是客戶端領域的經典課題,幾乎從操作系統誕生開始就是我們軟體從業者們的思考命題。為了促進 Flutter 在 4 個端的成熟,企業微信研發團隊也和 Google 團隊針對電腦端 Flutter 穩定版的落地做了多輪技術溝通。終於在近期的版本實現同一個功能跨平臺 4 端同步上線。企業微信每... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...