首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java I/O 效能調優全攻略:從緩衝到序列化

     編輯:Java 相關知識

基本原則

  1. 避免磁碟存取
  2. 避免作業系統呼叫
  3. 避免方法呼叫開銷
  4. 避免逐位元組/字元處理

低層 I/O 基準測試:計算檔案換行數

方法程式碼關鍵1MB 檔案耗時 (秒)倍數差異
1. FileInputStream.read()逐位元組讀取6.9基準
2. BufferedInputStream.read()8KB 緩衝0.97.7x
3. 自行緩衝 byte[2048]fis.read(buf)0.417x
4. 一次性讀全檔byte[len] = new byte[file.length()]最快記憶體風險

方法 2 為最佳平衡點;方法 3 需自行處理邊界,維護成本高。

輸出緩衝

  • System.out 預設行緩衝,互動式必要。
  • 批量輸出可關閉行緩衝:new PrintStream(new BufferedOutputStream(fdout, 1024), false),速度提升 3 倍。

文字檔處理

  • DataInputStream.readLine() 已棄用,無法正確轉碼 Unicode。
  • 改用 BufferedReader.readLine() (Reader 體系),速度快 20% 且支援完整字元集。

格式化代價

方式範例25000 次耗時 (秒)
固定字串print("The square of 5 is 25\n")1.3
字串串接print("The square of " + n + " is " + n*n + "\n")1.8
MessageFormat (預編譯)fmt.format(values)7.8
MessageFormat.format 靜態方法MessageFormat.format(pattern, values)10.4

國際化場景不可避免,但需意識到效能開銷。

隨機存取優化

RandomAccessFile.seek() 開銷大,解法:在 RandomAccessFile 上建立應用層緩衝區 (如 4KB),按區塊讀取,區塊內直接定位,適合二分搜尋等局部性存取。

壓縮傳輸

  • java.util.zip 提供 ZipOutputStream/InputStream。
  • 文字檔壓縮率約 50%,CPU 成本視 CPU/磁碟速度比而定。
  • 慢速媒體 (軟碟、網路) 壓縮後傳輸通常更快。

軟體快取

  • 全量載入 ArrayList:隨機存取 O(1),記憶體受限。
  • LRU 快取 (如保留最近 100 行):兼顧記憶體與局部性存取。

Tokenizing (分詞)

  • StreamTokenizer 方便但較慢 (內部按雙位元組處理)。
  • 手寫字元級解析器快 ~20%,代價是複雜度。

序列化

  • 標準 ObjectOutputStream 通用但慢 (含類描述、物件圖)。
  • 大量資料可考慮 DataOutputStream 自定二進位格式,或特定領域編碼 (如位圖)。

檔案屬性查詢

File.length()、isDirectory() 等需呼叫作業系統,開銷大,避免重複呼叫;遞迴掃描檔案系統時尤為明顯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved