Vector hóa SIMD
-O3 tự vector hóa vòng cộng dồn int nhưng TỪ CHỐI cộng dồn float — vì đổi thứ tự cộng float đổi kết quả IEEE. Bật -ffast-math thì nhanh 4.3 lần. Đo thật bằng lệnh NEON trong assembly.
-O3 tự vector hóa vòng cộng dồn int nhưng TỪ CHỐI cộng dồn float — vì đổi thứ tự cộng float đổi kết quả IEEE. Bật -ffast-math thì nhanh 4.3 lần. Đo thật bằng lệnh NEON trong assembly.
objdump -d tháo mã máy thật ra ba cột: địa chỉ, byte, lệnh. Nhưng tháo một .o chưa liên kết thấy 'bl 0 <puts>' — số 0 là chỗ trống chờ trình liên kết điền, không phải địa chỉ thật. Đo thật trong container.
Đối số thứ 3 trong f(int a, double b, int c) nằm ở thanh ghi x1 chứ không phải x2 — vì int và float dùng hai dải thanh ghi riêng, đếm độc lập. Đo thật bằng assembly aarch64 trong container.
-fomit-frame-pointer không bỏ khung ngăn xếp — nó chỉ bỏ con trỏ khung x29, tiết kiệm một lệnh và giải phóng một thanh ghi. Khung vẫn được cấp. Đo thật bằng prologue/epilogue trong assembly.
Khi số giá trị sống cùng lúc vượt số thanh ghi, trình dịch phải đổ bớt ra stack (spill). Nhưng áp lực đến từ giá trị sống đồng thời, không phải số biến khai báo — 40 biến dùng tuần tự vẫn 0 tràn. Và chi phí tràn thật, khi cô lập đúng, chỉ ~3%. Đo thật trong container.
nm liệt kê ký hiệu với mã loại T/D/U. C dùng tên thô; C++ nhét chữ ký vào tên (mangling) để cho phép nạp chồng — nên gọi hàm C từ C++ mà quên extern C thì không liên kết được. Đo thật trong container.