資料壓縮在高吞吐系統中無處不在:RPC 回應體、日誌落盤、快取序列化、跨機房同步。選錯演算法可能導致 CPU 瓶頸或頻寬浪費。本文基於 JMH 基準測試,對比 JDK 內建與主流第三方庫在 338 MB 真實文本資料上的壓縮速度、體積、吞吐量,提供選型決策依據。
| 演算法 / 實作 | 說明 |
|---|---|
| JDK GZIP | java.util.zip.GZIPOutputStream,高壓縮比、慢速 |
| JDK Deflate (Level 1-9) | DeflaterOutputStream,可調壓縮等級,Level 1 最快 |
| LZ4 (Fast / High) | LZ4 Java (JNI/Unsafe/Safe 三種實作),極致速度 |
| Snappy (Normal / Framed) | Google Snappy Java,速度與壓縮比平衡 |
@BenchmarkMode(SingleShotTime), Warmup 2, Measurement 3ByteArrayOutputStream (避免磁碟 I/O 干擾)| 實作 | 體積 (Bytes) | 壓縮率 |
|---|---|---|
| 原始 | 354,509,602 | 100% |
| GZIP | 64,200,201 | 18.1% |
| Deflate L1 | 78,369,711 | 22.1% |
| Deflate L6 | 64,200,191 | 18.1% |
| Deflate L9 | 63,839,200 | 18.0% |
| Snappy Normal | 138,250,196 | 39.0% |
| Snappy Framed | 101,470,113 | 28.6% |
| LZ4 Fast | 98,316,501 | 27.7% |
| LZ4 High | 82,076,909 | 23.1% |
| 實作 | 耗時 (ms) | 吞吐量 (MB/s) | 輸出 (MB) |
|---|---|---|---|
| LZ4 Fast (JNI) | 1,056 | 320 | 93.8 |
| LZ4 Fast (Unsafe) | 1,347 | 251 | 93.8 |
| LZ4 Fast (Safe) | 1,918 | 176 | 93.8 |
| Snappy Normal | 2,201 | 154 | 131.8 |
| Snappy Framed | 2,265 | 149 | 96.8 |
| Deflate L1 | 4,523 | 75 | 74.7 |
| Deflate L4 | 6,739 | 50 | 64.9 |
| GZIP (≈L6) | 10,352 | 33 | 61.2 |
| Deflate L9 | 14,878 | 23 | 60.9 |
| LZ4 High (JNI) | 7,490 | 45 | 78.3 |
完整 JMH 基準測試原始碼、Maven 依賴設定、各實作 Factory 類請見:
https://github.com/your-repo/java-compression-benchmark
「沒有最好的壓縮演算法,只有最適合場景的。」
— 依據 延遲敏感度、CPU 預算、儲存介質、網路頻寬 四維度決策。