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

Streaming JSON lớn trong Go: json.Decoder thay vì Unmarshal cả tệp

json.Unmarshal cần toàn bộ dữ liệu trong RAM rồi dựng mọi struct cùng lúc — bộ nhớ tỉ lệ với kích thước tệp, tệp GB làm sập app. json.Decoder đọc lười từng phần tử, giữ bộ nhớ hằng số. Đo thật trong Go: xử lý tệp JSON 41.6 MB, Unmarshal tốn +142.5 MB heap, streaming chỉ +2.3 MB — cùng kết quả.

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

Encoding nhị phân tùy biến trong Go: nhỏ hơn và nhanh hơn JSON

JSON là văn bản tự mô tả — lặp tên field, số là chuỗi ASCII, phải phân tích cú pháp khi đọc. Với dữ liệu nội bộ nóng, một định dạng nhị phân tùy biến gọn và nhanh hơn nhiều. Đo thật trong Go: 100k bản ghi, binary nhỏ hơn 2.3 lần, mã hóa nhanh 4 lần, giải mã nhanh 9 lần — cùng đánh đổi và rủi ro.

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

Memory-mapped file (mmap) trong Go: đọc tệp lớn không qua heap

os.ReadFile sao chép toàn bộ tệp vào heap Go. mmap ánh xạ tệp thẳng vào không gian địa chỉ, đọc như slice byte, để HĐH nạp trang theo nhu cầu — không copy, không heap, không áp lực GC. Đo thật trong Go: đọc tệp 200 MB, ReadFile tốn +191 MB heap và 125ms, mmap chỉ +0 MB heap và 31ms.

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

LRU cache tự cài trong Go: get/put O(1) bằng map và danh sách liên kết đôi

LRU cache khi đầy loại phần tử lâu nhất chưa dùng. Nó cần cả tra cứu theo key và cập nhật thứ tự dùng đều O(1) — không cấu trúc đơn lẻ nào làm được cả hai. Bài tự cài trong Go bằng map + danh sách liên kết đôi, đo thật: loại đúng phần tử ít dùng nhất, get+put chỉ 79.6 ns O(1) hằng số.

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

Benchmark chính xác với benchstat trong Go: một con số đơn lẻ dễ lừa

Chạy go test -bench một lần cho một con số, nhưng máy đầy nhiễu nên nó dao động mỗi lần. So hai phiên bản bằng một con số mỗi bên có thể kết luận sai. benchstat chạy nhiều lần, tính trung bình ± độ lệch, và so hai bản bằng p-value. Đo thật: cải tiến -94.84% (p=0.000) là thật, hàm không đổi báo p=1.000.

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

Cạm bẫy microbenchmark trong Go: trình biên dịch có thể xóa code bạn đo

Trình biên dịch Go tối ưu mạnh: kết quả không dùng bị loại, input hằng số bị tính sẵn — benchmark đo cái không còn chạy, cho số nhỏ hơn thực tế. Đo thật: cùng một hàm, benchmark sai báo 5.5 ns còn benchmark đúng (sink + input biến thiên) báo 9.35 ns — thiếu 41%. Và dấu hiệu nhận biết code bị xóa.