Web 22/09/2026 6 phút

Nginx phục vụ tĩnh và tối ưu hiệu năng: sendfile, cache, và đo bằng ab

Nginx phục vụ file tĩnh nhanh đến mức nào? Bài cuối sê-ri đo thật: sendfile (zero-copy) cho thông lượng ~281 MB/s và 4301 request/giây trên file 68KB, Cache-Control để trình duyệt khỏi tải lại, gzip nén 156 KB xuống 1.2 KB. Kèm một cái bẫy đo lường: ab mặc định HTTP/1.0 nên không nhận gzip — phải đo tỉ lệ nén bằng curl.

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

Big-O không phải lý thuyết suông: đo thật để thấy nó hiện ra

Ai cũng học Big-O rồi quên, vì nó nghe như toán hàn lâm. Nhưng Big-O là thứ ĐO được. Bài này chạy thật trong go-lab: khi N tăng gấp đôi, O(n) ×2, O(n²) ×4, còn O(log n) gần như đứng yên. Chính tỉ lệ 'nhân đôi N' đó là cách nhận ra độ phức tạp của code bạn — và lý do một hàm O(n²) chạy ngon lúc dev lại làm sập hệ thống lúc scale.

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

Linear vs binary search: binary nhanh 1.125 lần, nhưng không phải lúc nào cũng nên dùng

Binary search O(log n) nghe là biết thắng linear O(n). Bài này đo thật trong go-lab: ở N=262.144, binary nhanh hơn 1.125 lần một lần tìm. Nhưng binary đòi mảng đã sắp — và chi phí sort trước (306 µs) đổi cục diện: nếu chỉ tìm 1-2 lần trên mảng chưa sắp, linear thắng. Cộng thêm yếu tố cache khiến ở N nhỏ binary chỉ nhỉnh 3,7 lần.

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

Cùng O(n²) nhưng chậm hơn 14 lần: phần hiệu năng mà Big-O không nhìn thấy

Hai vòng lặp cùng số phép tính, cùng độ phức tạp O(n²), nhưng một cái chậm hơn cái kia 14 lần — chỉ vì thứ tự truy cập bộ nhớ. Bài này đo thật trong go-lab: duyệt mảng 2D theo cột chậm hơn theo hàng tới 13,9 lần vì cache. Nhưng cũng trung thực: AoS vs SoA và truy cập ngẫu nhiên lại gần như không khác, vì CPU hiện đại giỏi giấu độ trễ cho mẫu đều đặn.