Bài viết mới nhất

Tổng 2300 bài
Lập trình 22/09/2026 8 phút

Cuckoo filter: bộ lọc vừa tiết kiệm bộ nhớ vừa xóa được — thứ Bloom không làm

Bloom filter (phần 1 loạt này) kiểm tra tồn tại rất gọn nhưng không xóa được phần tử và tỉ lệ dương tính giả cố định. Cuckoo filter lưu fingerprint vào một trong hai bucket, đá (kick) khi đầy, nên xóa được và thường chính xác hơn Bloom ở cùng bộ nhớ. Bài này tự cài Cuckoo filter bằng Python, chạy thật: 249.036 phần tử ở load 95%, FPP 0,18%, xóa hoạt động — và đo điểm giao FPP Cuckoo vs Bloom.

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

Chọn cấu trúc dữ liệu xác suất nào? Tổng kết 12 phần bằng một bảng đo thật

Khép lại loạt Cấu trúc dữ liệu xác suất: điểm lại 11 cấu trúc đã học, mỗi cái trả lời một câu hỏi khác nhau, rồi chạy thật cả năm trên CÙNG một luồng 2 triệu sự kiện để so bộ nhớ và sai số với cách 'giữ hết + tính chính xác'. Kết quả đo được: 5 sketch cộng lại chỉ 527 KB thay cho 52 MB — nhỏ hơn ~96 lần, đổi lấy sai số 0,08%–4,57%. Kèm cây quyết định và khi nào KHÔNG nên dùng ước lượng.

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

JSON trong Go: tiện đến mức ta quên nó tốn gì — đo thật chi phí reflection

encoding/json của Go tiện kinh khủng: một cặp Marshal/Unmarshal cho mọi struct. Nhưng nó dùng reflection lúc chạy nên có chi phí ẩn. Bài này chạy thật một đơn hàng 5 mặt hàng: đo kích thước JSON (643 byte gọn, 928 byte thụt lề), và benchmark cho thấy Unmarshal chậm ~4 lần Marshal với 27 lần cấp phát bộ nhớ so với 3 — vì giải mã phải dựng lại slice, string, struct con.

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

Tối ưu JSON trong Go: cắt một nửa số lần cấp phát mà không đổi định dạng

Phần 1 đo được encoding/json tốn nhiều cấp phát, nhất là khi giải mã. Bài này giữ nguyên JSON nhưng tối ưu cách dùng: json.Encoder/Decoder ghi đọc thẳng io tránh []byte trung gian, và json.RawMessage hoãn giải mã phần chưa cần. Đo thật: Encoder cắt 50% số lần cấp phát khi ghi 1000 object, RawMessage giảm 61% cấp phát khi chỉ cần field ngoài, Decoder streaming giảm 32% bộ nhớ đổi lấy ~10% thời gian.

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

Protobuf wire format: mổ từng byte để hiểu vì sao nó gọn hơn JSON

Protobuf gọn hơn JSON nhiều — nhưng vì sao? Bài này mổ xẻ wire format tới từng byte: mỗi field là một tag ghép field number với wire type, số nén bằng varint 7 bit. Dùng gói protowire của Go (không cần protoc) để tự mã hóa một sản phẩm, in ra 20 byte hex và giải thích từng byte là gì, rồi giải mã lại chứng minh. Cùng dữ liệu, JSON tốn 58 byte còn Protobuf chỉ 20.

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

Protobuf vs JSON: cùng dữ liệu lên bàn cân — nhỏ hơn 2 lần, giải mã nhanh gần 10 lần

Phần 3 đã thấy Protobuf gọn hơn qua từng byte. Bài này cân đầy đủ trên cùng một đơn hàng thật (nested + slice): đo kích thước lẫn tốc độ marshal/unmarshal. Kết quả đo được: Protobuf nhỏ hơn ~2 lần, và giải mã nhanh gấp ~9,7 lần JSON (283 vs 2743 ns) — lợi thế lớn nhất nằm ở giải mã, nơi JSON phải parse text và dùng reflection.