- บทความเกี่ยวกับประสิทธิภาพการใช้หน่วยความจำของอาร์เรย์ enum ใน Zig และ Rust
- ใน Rust, enum ที่มีขนาดแปรผันได้ (หรือ tagged union) จำเป็นต้องจัดสรรข้อมูลให้เพียงพอสำหรับ variant ที่ใหญ่ที่สุด จึงอาจก่อให้เกิดการแตกกระจายของหน่วยความจำได้มาก
- การแตกกระจายของหน่วยความจำลักษณะนี้อาจเป็นปัญหาเมื่อรวบรวม enum จำนวนมากไว้ใน
Vec หรือ HashMap
- ผู้เขียนเสนอว่า ใน Rust แทบเป็นไปไม่ได้เลยที่จะสร้างโครงสร้างข้อมูลแบบเฉพาะทางสำหรับ enum บางชนิดเพื่อลดการแตกกระจายลง
- Zig อนุญาตให้แปลงโครงสร้างข้อมูลได้อย่างยืดหยุ่นและมีประสิทธิภาพมากกว่า
- ผู้เขียนเน้นย้ำถึงความสำคัญของการลดการแตกกระจายของหน่วยความจำ โดยเฉพาะในบริบทของคอมไพเลอร์และโหนดของ syntax tree
- บทความเสนอว่าวิธีที่พบบ่อยที่สุดในการปรับปรุงประสิทธิภาพการจัดแพ็กคือการใช้ tagged index เพื่อให้ variant ของ enum มีขนาดเล็กที่สุดเท่าที่เป็นไปได้
- การคอมไพล์แบบเป็นขั้นของ Zig เปิดทางให้มีชนิดคอนเทนเนอร์ที่สามารถทำการแปลงแบบ struct-of-arrays (SoA) กับชนิดใดก็ได้โดยทั่วไป
- ผู้เขียนแนะนำแนวคิด array of variant arrays (AoVA) เพื่อช่วยลดการแตกกระจายลงอีก
- บทความยังกล่าวถึงแนวคิดของ size equivalence classes ซึ่งเป็นการจัดกลุ่ม variant ที่มีขนาดเท่ากันไว้ด้วยกัน เพื่อลดจำนวนเวกเตอร์รวมภายในคอนเทนเนอร์
- ผู้เขียนได้สร้างต้นแบบของโครงสร้างข้อมูลนี้ใน Zig โดยใช้ compiler built-ins สำหรับชนิดของฟิลด์, ขนาดเป็นไบต์และบิต, และการตรวจสอบ discriminant
- บทความสรุปว่า แม้การเขียนโครงสร้างข้อมูลทั่วไปที่มีประสิทธิภาพสูงมากใน Rust อาจเป็นเรื่องท้าทาย แต่
comptime ของ Zig ช่วยให้สามารถจัดวางหน่วยความจำได้อย่างยืดหยุ่นและปรับแต่งได้มากกว่า
ยังไม่มีความคิดเห็น