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.
Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.
-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.
int arr[1000000]={0} không tốn byte nào trong file (nằm .bss), nhưng ={1} tốn đúng 4MB (nhảy sang .data). Một phần tử khác 0 kéo cả mảng từ miễn phí sang tốn đĩa. Đo bằng size và nm trong container.
next()+next() cho 21 trên gcc/aarch64, nhất quán mọi lần — nhưng thứ tự đó không được chuẩn bảo đảm, và i=i++ + ++i là UB. Nhất quán trên một máy không phải 'được định nghĩa'. Đo thật trong container.
ld.so không phân giải mọi ký hiệu lúc khởi động — lazy binding chỉ phân giải một hàm khi nó được gọi lần đầu, và hàm không gọi thì không bao giờ được đụng tới. Đo thật bằng PLT/GOT và LD_DEBUG trong container.
Struct 8 cờ 1-bit tôi tưởng chiếm 1 byte, đo ra 4 — vì kiểu cơ sở là int. Và thứ tự bit trong đơn vị là tùy trình dịch, nên đừng dùng trường bit để khớp bố cục nhị phân ngoài. Đo sizeof, byte thô và assembly trong container.
Liên kết tĩnh cho file to gấp 12 lần — và khởi động CHẬM hơn 1,75 lần, ngược với câu 'tĩnh nhanh hơn'. Vì bản tĩnh phải nạp 522KB mã còn bản động dùng libc đã thường trú. Đo thật trong container.