Q

Quản trị viên

Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.

2300 bài viết · Website
Giải thuật 03/09/2026 9 phút

Hàng đợi vô hạn nuốt 43MB trong nửa giây rồi vẫn phình: vì sao 'buffer thật to' là quả bom

Tưởng cứ hàng đợi lớn (hoặc vô hạn) để không mất việc, và producer đẩy càng nhanh càng tốt? Tôi đo: producer nhanh hơn consumer với hàng đợi vô hạn thì độ sâu chạm 5,46 triệu item, latency nổ lên 270ms, bộ nhớ phình mãi; đặt hàng đợi có chặn thì producer tự ghìm về tốc độ consumer, latency có trần, bộ nhớ gần 0. Backpressure là khác biệt giữa ổn định và sụp đổ.

Giải thuật 03/09/2026 8 phút

Tra nhanh hơn 18.554 lần mà vẫn thua, tới khi bạn tìm lần thứ 93

Mỗi truy vấn suffix array nhanh hơn KMP 18.554 lần (0,21 µs so 3.869 µs) — nhưng phải dựng mảng trước, tốn 358 ms cho văn bản 2 triệu ký tự. Cho một lần tìm, KMP thắng đậm; suffix array chỉ có lãi sau ~93 truy vấn trên cùng văn bản. 'Nhanh nhất' vô nghĩa nếu chưa hỏi tìm bao nhiêu lần. Tôi đo.

Giải thuật 03/09/2026 8 phút

Lưu x*y vào biến tạm cho nhanh? Compiler đã làm rồi — cái đáng lưu là chỗ khác

Ai cũng được dạy lưu biểu thức chung vào biến tạm cho khỏi tính lại. Tôi đo và thấy compiler tự làm: bản viết lặp và bản lưu tạm sinh mã giống hệt. Nhưng một phép ghi qua con trỏ có thể trùng lại chặn đứng nó, buộc tính lại — và restrict khôi phục, nhanh 1,34 lần ở phép chia. Aliasing mới là thứ quyết định.

Giải thuật 03/09/2026 9 phút

Sách nói dựng heap là O(n log n) — đo ra O(n), và tôi hiểu ra mình đọc nhầm dòng nào

Chèn từng phần tử để dựng heap 'phải là' O(n log n). Nhưng đo dữ liệu ngẫu nhiên thì nó phẳng 2,3 thao tác/phần tử — cũng O(n). O(n log n) chỉ hiện ở ca xấu (chèn giảm dần): thao tác leo 16→22 theo log n. Heapify thì O(n) bất kể đầu vào. Và heap không sắp xếp — nó chỉ cho min rẻ. Tôi đo.

Giải thuật 03/09/2026 8 phút

volatile không cứu code đa luồng: đếm chung vẫn mất 50%, và -O2 giấu luôn cuộc đua

Tưởng biến chung đọc/ghi bình thường vẫn chạy được, và volatile là đủ cho đa luồng? Tôi đo: hai luồng tăng một biến non-atomic mất ~50% cập nhật, đọc cờ chung non-atomic bị -O2 hoist thành treo vĩnh viễn — chỉ atomic mới đảm bảo. Và trớ trêu, -O2 gập mất cuộc đua ngay trong phép đo về nó.

Giải thuật 03/09/2026 10 phút

Đường đọc nhanh hơn rwlock 374 lần trong nhân Linux — bí mật là không ai ghi chung

Tưởng đọc trong cấu trúc lock-free cũng phải đồng bộ như rwlock, và thu hồi bộ nhớ lock-free là miễn phí? Tôi đo: đọc kiểu RCU ghi ô riêng nên scale gần tuyến tính, nhanh 374 lần rwlock ở 8 luồng — nhưng cái 'miễn phí' đó được trả ở writer, phải chờ grace period rồi mới free. Tối ưu chỉ dời chi phí, không xóa.