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

Mỗi luồng ghi biến riêng, không chia sẻ gì — vẫn chậm gấp đôi: bí ẩn false sharing

Tưởng hai biến khác nhau, mỗi luồng ghi biến của riêng mình thì không thể ảnh hưởng nhau? Tôi đo: chúng làm nhau chậm 2,05 lần ở 8 luồng vì tình cờ nằm chung một dòng cache 64 byte — false sharing. Căn lề mỗi biến sang một dòng riêng thì nhanh gấp đôi, dù logic không đổi một chữ. Bug hiệu năng vô hình trong mã nguồn.

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

16 luồng chạy chậm hơn 1 luồng 16 lần: khi thêm luồng làm chương trình tệ đi

Tưởng thêm luồng luôn nhanh hơn và song song scale tuyến tính? Tôi đo hai workload trên cùng một máy: loại độc lập scale tới ~số lõi (4,86× ở 16 luồng), còn loại cùng ghi một biến scale ÂM — 16 luồng chỉ bằng 6% một luồng. Khác biệt duy nhất là có chia sẻ ghi hay không. Song song không tự động nhanh.

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

Spinlock nhanh hơn mutex 1,7 lần — rồi chậm hơn 36 lần khi đông luồng

Tưởng spinlock luôn nhanh hơn mutex vì không vào nhân? Tôi đo: ở tranh chấp thấp và ít luồng, spinlock nhanh 1,7 lần; nhưng đông luồng hoặc vượt số lõi thì spinlock đốt CPU quay vô ích và chậm hơn mutex 7 đến 36 lần, trong khi mutex gần như phẳng. Không có cái luôn thắng — chọn theo hoàn cảnh, không theo khẩu hiệu.

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

Read-write lock với 8 luồng toàn đọc lại chậm hơn mutex 5,9 lần — trừ khi mỗi lần đọc đủ dài

Tưởng cứ đọc nhiều thì rwlock luôn nhanh hơn mutex? Tôi đo: với vùng tới hạn đọc cực ngắn, rwlock chậm hơn mutex 5,9 lần vì bộ đếm đọc là một ghi chung bị cache nảy; chỉ khi mỗi lần đọc đủ dài rwlock mới thắng 6,3 lần nhờ đọc thật sự song song. Điểm lật nằm ở độ dài đọc, không phải ở đọc-nhiều-hay-ít.

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

Lock-free nhanh gấp 3 lần mutex — cho tới khi 8 producer khiến nó thua ngược

Tưởng lock-free luôn nhanh hơn có khóa nên cứ bỏ mutex đi? Tôi đo: hàng đợi SPSC lock-free nhanh hơn mutex 3 lần vì hai bên ghi hai chỉ số riêng không tranh; nhưng nhiều producer cùng đẩy vào một hàng đợi thì ở 8 producer lock-free lại thua mutex, vì đụng đúng bức tường cache. Lock-free nhanh khi không có ghi chung, và cái giá là code khó viết đúng.

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

Hạ seq_cst xuống relaxed để 'đi nhanh' trên ARM: đo ra tiết kiệm 1%, đổi lấy một lớp bug

Tưởng seq_cst đắt hơn relaxed nhiều nên nên hạ xuống cho nhanh? Tôi đọc assembly và bấm giờ trên ARMv8: ba mức sinh lệnh khác nhau nhưng thời gian chênh ~1% vì ARM có sẵn ldar/stlr/ldaddal, không cần rào dmb nặng. Chọn ordering cho đúng ngữ nghĩa, không phải tốc độ — seq_cst mặc định gần như miễn phí.