Lập trình 22/09/2026 7 phút

gzip vs bzip2 vs xz vs zstd: bốn thuật toán nén, đo thật để biết chọn cái nào

Bốn công cụ nén phổ biến, bốn triết lý khác nhau. Bài này nén cùng một file log 25MB bằng cả bốn và đo đủ bốn số: kích thước, tỉ lệ, thời gian nén, thời gian giải nén. Kết quả thật có bất ngờ: zstd -3 nén trong 61ms còn xz mất 7 giây; zstd giải nén 12ms bất kể mức nén; và bzip2 nén chặt nhất trên log này (13.3x) vì BWT hợp dữ liệu lặp. Khi nào chọn cái nào.

Lập trình 22/09/2026 7 phút

zstd và từ điển: nén nghìn bản ghi JSON nhỏ từ 1.3x lên 4.4x

Nén từng bản ghi nhỏ riêng lẻ (cache entry, message, log record ~200 byte) cho tỉ lệ tệ hại vì mỗi lần nén bắt đầu từ số 0. Bài này đo thật trên 3000 JSON nhỏ: nén riêng không từ điển chỉ được 1.3x, nhưng huấn luyện một từ điển 8KB bằng zstd --train rồi nén với nó đạt 4.4x — cải thiện 3.5 lần. Vì sao, và khi nào từ điển là công cụ đúng.

Lập trình 22/09/2026 6 phút

Nén phụ thuộc dữ liệu: vì sao cùng gzip nén mã nguồn 292x mà nén ảnh 1x

Không có 'tỉ lệ nén của gzip' — tỉ lệ phụ thuộc hoàn toàn vào dữ liệu, cụ thể là entropy của nó. Bài này đo thật cùng gzip trên nhiều loại 4MB: mã nguồn lặp nhiều nén 292 lần, JSON 15 lần, text 5 lần, nhưng số ngẫu nhiên và dữ liệu đã nén chỉ 1 lần (thậm chí to hơn). Và vì sao bạn không bao giờ nên gzip một file .jpg, .zip hay .mp4.

Lập trình 22/09/2026 6 phút

Nén trong HTTP: vì sao trang web tải nhanh gấp 10 lần mà bạn không thấy gì

Mỗi lần trình duyệt tải một trang, nó và server âm thầm thương lượng nén qua header Accept-Encoding và Content-Encoding. Bài này đo thật trên coffeecode.vn: trang chủ 245KB tải về chỉ còn 25KB nhờ gzip (nhỏ 9.8 lần). Và so gzip với brotli trên chính HTML đó — brotli nhỏ hơn gzip 24%. Cơ chế thương lượng, vì sao Vary: Accept-Encoding là bắt buộc, và chỉ nén text.

Lập trình Go 22/09/2026 6 phút

Nén trong Go: compress/gzip, chọn mức, và nén luồng không nạp hết vào RAM

Go có nén tích hợp trong thư viện chuẩn: compress/gzip, flate, zlib. Bài này đo thật: gzip BestSpeed nén 10MB trong 19ms, BestCompression trong 437ms (nhỏ hơn chưa tới 0.5%). Và cách nén theo luồng bằng io.Copy qua gzip.Writer để nén file 10GB với bộ nhớ vài chục KB. Kèm cái bẫy quên Close() làm hỏng dữ liệu, và cách tái dùng Writer bằng sync.Pool.

Lập trình 22/09/2026 6 phút

Chọn thuật toán nén: khung quyết định theo bốn tiêu chí, và tổng kết cả loạt

Bài cuối loạt Nén: không có thuật toán nén tốt nhất, chỉ có tốt nhất cho ràng buộc của bạn. Bài này đo thật năm công cụ trên cùng 22MB — lz4 nén/giải nhanh nhất (32ms/9ms), xz nén chặt nhất (7.6x), zstd -19 vừa nhỏ vừa giải nhanh (7.3x, 16ms) — mỗi cái vô địch một tiêu chí khác. Kèm cây quyết định thực dụng và tổng kết 12 phần từ entropy tới chọn thuật toán.