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 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.

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

Bloom filter: trả lời 'có trong tập không' bằng 1/46 bộ nhớ, đổi lại chút báo nhầm

Cần kiểm tra một phần tử có trong tập triệu phần tử không, mà không muốn tốn hàng chục MB? Bloom filter làm được bằng một mảng bit và vài hàm băm. Bài này tự cài Bloom và đo thật: thay 57MB set bằng 1.25MB (nhỏ hơn 46 lần), tỉ lệ báo nhầm thực tế 0.83% khớp gần như hoàn hảo công thức lý thuyết 0.82%, và không bao giờ báo sót. Cơ chế, công thức, và khi nào dùng.