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.

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

'mmap nhanh gấp 8 lần read()' — con số đẹp tôi suýt công bố, hóa ra hai bên làm hai việc khác nhau

mmap trông như miễn phí vì không có syscall read — phép đo đầu cho nó nhanh gấp 8 lần. Nhưng getrusage tố cáo nó mới chạm 2176 trang chứ chưa đọc hết file. Cho cả hai cùng cộng 256MB: read() nhanh gấp 5 lần mmap (87 so với 430 ms). Benchmark chỉ có nghĩa khi hai bên làm đúng cùng một việc.

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

Khi mảng quét O(n) đánh bại hash map O(1)

Hash map O(1) nên luôn nhanh nhất cho tra cứu? Đo ra: với khóa chuỗi (băm phải đọc cả 24 ký tự ~10ns), quét tuyến tính một mảng nhỏ thắng hash map tới n≈16 — vì hằng số nhỏ hơn nhiều: cache liền, so sánh thoát sớm, không băm, không con trỏ. Big-O là tiệm cận n→vô cùng; ở n nhỏ chính hằng số quyết định, và điểm giao tùy giá của khóa.

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

-Os cho binary nhỏ nhất mà tôi tưởng phải chậm — hóa ra có kernel nó chỉ thua -O2 9%

-Os luôn chậm hơn -O2 vì bỏ tối ưu? Tôi đo cả kích thước lẫn tốc độ và cái nhãn chậm chỉ đúng nửa: -Os cho mã nhỏ nhất trong nhóm tối ưu, và tốc độ thì hỗn hợp — kernel số học nặng chậm 66% vì mất vector, nhưng kernel nhiều nhánh chỉ chậm 9%. Nó là điểm đánh đổi khác, không phải bản chậm.

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

-march=native nhanh 2,66 lần — rồi làm vỡ build ngay trước mắt tôi

Cứ bật -march=native cho nhanh? Tôi đo và thấy hai mặt: -march đúng mở khóa lệnh dotprod cho kernel int8 nhanh 2,66 lần thật, nhưng -march=native trong container này còn không build nổi vì assembler từ chối lệnh gcc phát ra. Rủi ro mong manh của nó hiện ngay lúc build, chưa nói tới SIGILL lúc chạy trên máy khác.

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

Tôi malloc một struct rồi free — gcc xóa sạch cả hai, làm như tôi chưa từng viết

Khai struct local là chắc chắn tốn ô nhớ stack, malloc thì tốn heap? Tôi đo và thấy compiler làm biến mất cả hai khi chứng minh được đối tượng không thoát khỏi hàm: struct thành thanh ghi, malloc/free bốc hơi, tốc độ y hệt. Cái đắt không phải việc khai hay cấp phát — mà là lấy địa chỉ (&) khiến nó thoát ra ngoài.