Trình biên dịch 03/09/2026 8 phút

Tôi chắc -Wall sẽ bắt lỗi nguy hiểm nhất — nó im re, và lý do nằm ngay trong tên cảnh báo

-Wall -Wextra bắt gọn bốn lỗi mà mã vẫn dịch trơn, exit 0. Nhưng lỗi dùng biến chưa khởi tạo — thứ nguy hiểm nhất — lọt qua cả -O0 lẫn -O2, kể cả khi bật thẳng -Wmaybe-uninitialized. Đo thật trong container, và bài học về giới hạn của phân tích tĩnh.

Trình biên dịch 03/09/2026 8 phút

clang thắng ba vòng lặp, tôi định khoe — rồi đọc assembly thấy mình sai cả lý do

Đo sáu vòng lặp bằng gcc và clang: clang nhanh hơn 2-4 lần ở vài vòng, hòa ở số khác. Tôi định kết 'clang nhanh hơn' và giải thích nó thắng popcount nhờ lệnh cnt. Đọc mã máy ra ngược hẳn — gcc mới dùng cnt mà vẫn chậm. Bài cuối sê-ri, và cái bẫy tôi rơi vào cả hai chân.

Hệ điều hành 03/09/2026 8 phút

getpid() tốn 120ns, gấp 55 lần một lời gọi hàm: và 'sự thật' tôi nhớ về nó đã hết hạn từ 2017

Một syscall (getpid) tốn ~120 ns, gấp ~55 lần một lời gọi hàm (~2 ns) — vì phải vượt vào kernel. Tôi tưởng glibc cache pid nên getpid rẻ; strace chứng minh nó trap mỗi lần (5 gọi = 5 syscall). glibc đã bỏ cache đó từ 2017 để đổi lấy tính đúng. Đừng tin sự thật nhớ được về hệ thống — đo trên máy thật.

Hệ điều hành 03/09/2026 9 phút

Chuyển ngữ cảnh '15 micro giây' — con số tôi suýt tin, hóa ra đo nhầm sang một thứ hoàn toàn khác

Chuyển ngữ cảnh giữa hai tiến trình trên cùng một lõi tốn ~691 ns (đã gồm syscall pipe ~300 ns). Nhưng lần đầu không ghim lõi tôi đo ra 15.000 ns — vì hai tiến trình rơi vào hai lõi khác, chẳng có chuyển ngữ cảnh nào, tôi đo nhầm sang đánh thức xuyên lõi. Biến ẩn 'lõi nào chạy' đổi cả đại lượng.