Tăng tốc mã: Đừng truyền struct lớn hơn 16 byte trên AMD64
- Để cải thiện hiệu năng của ngôn ngữ Neat, cách truyền mảng đã được thay đổi từ một tham số struct duy nhất sang ba tham số con trỏ.
- Lý do mảng của Neat chậm hơn mảng của ngôn ngữ D là vì mảng có kích thước 24 byte, vượt quá 16 byte nên tham số được truyền theo cách khác.
- Theo đặc tả SystemV AMD64 ABI, mọi struct vượt quá 16 byte đều được truyền thông qua con trỏ.
Xác nhận vấn đề bằng benchmark
- Thông qua benchmark, có thể xác nhận sự khác biệt hiệu năng giữa cách truyền struct và cách truyền từng trường riêng lẻ.
- Khi truyền struct, cần có quá trình cấp phát trên stack và sao chép, trong khi khi truyền từng trường riêng lẻ thì chúng được chuyển trực tiếp qua các thanh ghi SSE.
- Cách truyền từng trường riêng lẻ cho hiệu năng nhanh hơn khoảng 2 lần so với cách truyền struct.
Lựa chọn của nhà thiết kế ngôn ngữ
- Khi gọi C API thì phải tuân theo C ABI, nhưng các kiểu cấp cao được sử dụng nội bộ không nhất thiết phải được biểu diễn dưới dạng struct.
- Nhà thiết kế ngôn ngữ có thể quyết định cách mảng, tuple, union type, v.v. sẽ được truyền đi.
- Truyền các kiểu vượt quá 16 byte dưới dạng từng trường riêng lẻ có thể giúp cải thiện hiệu năng.
Ý kiến của GN⁺
- Bài viết này rất hữu ích cho các lập trình viên quan tâm đến tối ưu hóa phần mềm.
- Đặc biệt, bài viết cho thấy rằng khi phát triển các ứng dụng nhạy cảm về hiệu năng, kích thước struct và cách truyền tham số có thể tạo ra ảnh hưởng quan trọng.
- Các nhà thiết kế ngôn ngữ hoặc nhà phát triển API có thể tận dụng thông tin này để tìm cơ hội cải thiện hiệu năng.
1 bình luận
Ý kiến Hacker News
vec3(3xfloat) bị mở rộng từ 12 byte lên 16 byte. Họ phát hiện dùng 16 byte lại nhanh hơn vì phù hợp với các lần đọc 8 byte. Kết quả làvec3được dùng giống nhưvec4. Luôn nên benchmark toàn cục.cdeclmặc định, các struct lớn hơn 8 byte sẽ không được truyền qua thanh ghi.struct Vectorsang truyền bằng tham chiếuconst struct Vector &mà không ảnh hưởng đến phía trình gọi. Nhiều đoạn mã C++ đầy lỗi con trỏ là do dùng con trỏ một cách không cần thiết, trong khi truyền bằng tham chiếu có thể dễ dùng và an toàn hơn.