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.

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

encoding/gob: định dạng nhị phân của riêng Go, và cái bẫy khi chỉ gửi một giá trị

gob là serialization gọn của Go — tự mô tả kiểu nên không cần schema ngoài như Protobuf. Nhưng nó có một đặc tính dễ gây bất ngờ: gửi một giá trị lẻ thì gob còn LỚN hơn JSON vì gói kèm mô tả kiểu. Bài này đo thật: 1 giá trị gob 443 byte vs JSON 398, nhưng stream 1000 giá trị thì gob chỉ 215 byte/giá trị (~nửa JSON); và Encoder tái dùng mã hóa chỉ 1 lần cấp phát, nhanh hơn JSON.

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

MessagePack: JSON nhị phân — nhưng đo thật cho thấy nó không nhỏ như bạn tưởng

MessagePack được quảng cáo là JSON nhị phân gọn hơn. Đúng, nhưng đo thật cho con số khiêm tốn hơn kỳ vọng: cùng một đơn hàng, MessagePack mặc định chỉ nhỏ hơn JSON 1,08 lần, bật compact ints được 1,25 lần — còn xa Protobuf (~2 lần). Lý do lộ ra khi nhìn byte: MessagePack vẫn lưu tên field trong map. Điểm mạnh thật của nó là giải mã nhanh ~2,4 lần JSON và đổi đúng một dòng code.

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

CBOR: người anh em chuẩn hóa của MessagePack, và vì sao IETF cần thêm một định dạng

CBOR (RFC 8949) gần như MessagePack: nhị phân, tự mô tả, cùng ý tưởng byte format. Vậy sao IETF lại chuẩn hóa thêm một định dạng? Bài này đo thật: cùng đơn hàng, CBOR 339 byte nhỏ hơn cả MessagePack 392 và JSON 440, mã hóa nhanh nhất trong ba. Nhưng khác biệt lớn nhất là CBOR có tag ngữ nghĩa và là chuẩn IETF — nền tảng của WebAuthn, COSE, CWT, IoT.