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

Java 效能優化實戰清單:迴圈、字串、基本型別、異常與基準測試五大面向

     編輯:Java 相關知識

前言

效能優化非玄學,而是建立在 JVM 執行模型與硬體特性之上的工程取捨。本文整理五大高頻優化方向,附程式碼對比,適合作為 Code Review 核對清單。

1. 迴圈優化:提取不變量、快取長度

差:每次迭代呼叫 size()

for (int i = 0; i < list.size(); i++) { ... }

好:快取長度到區域變數

for (int i = 0, n = list.size(); i < n; i++) { ... }

JIT 可能內聯 size(),但顯式快取零成本且語意清晰。

差:迴圈內重複計算不變運算

for (int i = 0; i < x.length; i++) {
    X[i] = x[i] / scaleA * scaleB;  // 每次做除法與乘法
}

好:提取常數因子

double scale = (double) scaleB / scaleA;  // 注意型別提升避免整數除法截斷
for (int i = 0; i < x.length; i++) {
    X[i] = x[i] * scale;
}

2. 字串處理:拒絕 + 拼接、善用 StringBuilder

反模式

String s = "";
for (String part : parts) s += part;  // 每次產生新 String + StringBuilder + toString()

最佳實踐

// 預估總長度避免擴容複製
StringBuilder sb = new StringBuilder(estimatedTotalLength);
for (String part : parts) sb.append(part);
String result = sb.toString();

補充:Java 9+ String.join()、StringJoiner 內部同樣用 StringBuilder,語意更清楚。

3. 基本型別優於包裝型別

  • 熱點迴圈、大量陣列運算 → 用 int/long/double 而非 Integer/Long/Double
  • 包裝類僅用於:泛型參數、需 null 語意、集合存儲
  • 常數運算式加 static final:編譯期常數摺疊,執行期零開銷

4. 異常僅用於真正錯誤場景

反模式:用異常控制流程

try { return map.get(key); } catch (NullPointerException e) { return defaultValue; }

正確做法

Value v = map.get(key);
return (v != null) ? v : defaultValue;

原因:建立異常需捕獲堆疊快照,成本極高(微秒級 vs 納秒級)。

合併 try-catch 區塊

// 差:每個呼叫獨立 try-catch
try { foo(); } catch (...) {}
try { bar(); } catch (...) {}

// 好:單一 try-catch 包多個呼叫
try {
    foo();
    bar();
} catch (Exception e) { ... }

5. 基準測試:不測不知,一測嚇一跳

  • JVM 預熱、JIT 編譯、逃逸分析、標量替換會劇烈改變效能表現
  • 不同 GC、不同 CPU 架構(x86 vs ARM)、不同 JDK 版本結果不同
  • 必須用 JMH (Java Microbenchmark Harness) 寫基準測試,手動 System.nanoTime() 迴圈極易誤導
  • 範例場景:Servlet 容器中 OutputStream.write(bytes) vs PrintWriter.print(string) 哪個快?只能在目標環境實測才知道。

總結清單

面向核心原則工具/檢查點
迴圈不變量外提、長度快取、減少方法呼叫JIT 日誌 (-XX:+PrintCompilation)
字串拼接用 StringBuilder、預估容量GC 日誌觀察暫存物件量
資料型別熱點路徑用基本型別、常數 static finalJOL (Java Object Layout) 觀察物件大小
異常僅用於異常狀態、合併 catch 區塊異常堆疊追蹤開銷分析
驗證無 JMH 測試不優化、目標環境實測JMH、Async Profiler、perf

結語

優化順序永遠是:正確性 → 可讀性 → 架構層面優化(演算法、快取、非同步)→ 微觀代碼優化。本文技巧屬於最後一層,若架構有瓶頸(如 N+1 查詢、同步阻塞),微優化效果微乎其微。先測量,再動刀,才是專業態度。

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