เพิ่มความเร็วของโค้ด: อย่าส่งผ่าน struct ที่ใหญ่กว่า 16 ไบต์บน AMD64
- เพื่อปรับปรุงประสิทธิภาพของภาษา Neat ได้เปลี่ยนวิธีส่งอาร์เรย์จากการใช้พารามิเตอร์ struct หนึ่งตัวเป็นการส่งพารามิเตอร์ pointer สามตัวแทน
- สาเหตุที่อาร์เรย์ของ Neat ช้ากว่าอาร์เรย์ของภาษา D คืออาร์เรย์ขนาด 24 ไบต์มีขนาดเกิน 16 ไบต์ จึงถูกส่งพารามิเตอร์ด้วยวิธีที่ต่างออกไป
- ตามข้อกำหนด SystemV AMD64 ABI, struct ทุกตัวที่มีขนาดเกิน 16 ไบต์จะถูกส่งผ่าน pointer
ตรวจสอบปัญหาด้วยเบนช์มาร์ก
- ใช้เบนช์มาร์กเพื่อยืนยันความแตกต่างด้านประสิทธิภาพระหว่างการส่ง struct ทั้งก้อนกับการส่งฟิลด์แยกกัน
- เมื่อส่ง struct จำเป็นต้องมีขั้นตอนจัดสรรบนสแตกและคัดลอกข้อมูล แต่เมื่อส่งฟิลด์แยกกันสามารถส่งผ่าน SSE register ได้โดยตรง
- วิธีส่งฟิลด์แยกกันให้ประสิทธิภาพเร็วกว่าวิธีส่ง struct ประมาณ 2 เท่า
ทางเลือกของผู้ออกแบบภาษา
- เมื่อต้องเรียก C API จำเป็นต้องปฏิบัติตาม C ABI แต่ชนิดข้อมูลระดับสูงที่ใช้ภายในไม่จำเป็นต้องแทนด้วย struct เสมอไป
- ผู้ออกแบบภาษาสามารถตัดสินใจได้ว่าอาร์เรย์ ทูเพิล และ sum type จะถูกส่งผ่านอย่างไร
- การส่งชนิดข้อมูลที่มีขนาดเกิน 16 ไบต์แบบแยกฟิลด์อาจช่วยเพิ่มประสิทธิภาพได้
ความเห็นของ GN⁺
- บทความนี้มีประโยชน์อย่างมากสำหรับนักพัฒนาที่สนใจการเพิ่มประสิทธิภาพซอฟต์แวร์
- โดยเฉพาะอย่างยิ่ง มันแสดงให้เห็นว่าเมื่อพัฒนาแอปพลิเคชันที่ไวต่อประสิทธิภาพ ขนาดของ struct และวิธีการส่งผ่านสามารถส่งผลสำคัญได้
- ผู้ออกแบบภาษาและนักพัฒนา API สามารถใช้ข้อมูลนี้เพื่อหาโอกาสในการปรับปรุงประสิทธิภาพได้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
struct Vectorให้ส่งเป็น reference แบบconst struct Vector &โดยไม่กระทบต่อผู้เรียก โค้ด C++ จำนวนมากที่มีบั๊กจาก pointer ใช้ pointer โดยไม่จำเป็น ทั้งที่การส่งผ่าน reference ใช้งานได้ง่ายและปลอดภัยกว่า