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

Ép nội tuyến một hàm to: mã phình 14 lần, tốc độ tăng đúng 1% — ngưỡng của gcc là bạn, không phải thù

Hàm to gọi từ một chỗ vẫn được nội tuyến bất kể lớn; gọi từ nhiều chỗ thì gcc giữ lời gọi. Tôi ép always_inline vượt ngưỡng — đổi 14 lần kích thước mã lấy vỏn vẹn 1% tốc độ. Đo bằng objdump thật trong container.

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.