แชร์ประสบการณ์การปรับปรุงประสิทธิภาพของ serde_json
- บทนำ
- เมื่อไม่นานมานี้ได้ปรับปรุงความเร็วในการประมวลผลสตริงของ serde_json ขึ้น 20% ผ่านงานด้านประสิทธิภาพ
- ใช้ serde ซึ่งเป็นเฟรมเวิร์กสำหรับการ serialize และ deserialize ของ Rust และใช้ serde_json สำหรับจัดการ JSON
- การปรับปรุงประสิทธิภาพสามารถสร้างประโยชน์ได้กับทั้ง ecosystem
จุดเริ่มต้น
- การทำงานกับไลบรารี #[iex]
- ใช้ serde และ serde_json ในการ benchmark ด้านประสิทธิภาพ
- พบการตัดสินใจที่น่าสงสัยในโค้ดที่มีความสำคัญต่อประสิทธิภาพ
- เส้นทาง error ช้ากว่าเส้นทาง success มากกว่า 2 เท่า
การแก้ปัญหา
- การปรับแต่งเส้นทาง error
- ฟังก์ชัน
position_of_index เป็นสาเหตุของคอขวด
- ใช้ crate
memchr เพื่อปรับปรุงการค้นหาในสตริงให้มีประสิทธิภาพขึ้น
- ผลลัพธ์การปรับปรุงประสิทธิภาพ: ความเร็วของเส้นทาง error ดีขึ้น
การปรับแต่งเพิ่มเติม
- การปรับแต่งการ parse สตริง
- ทดลองใช้ฟังก์ชัน
memchr2 แต่ไม่สำเร็จ
- ใช้เทคนิค SWAR (SIMD ภายในรีจิสเตอร์) เพื่อปรับปรุงการค้นหา control character
- แก้ปัญหาประสิทธิภาพลดลงในสตริงสั้น
การจัดการยูนิโค้ด
- การปรับแต่งการ parse ยูนิโค้ด
- ปรับปรุงประสิทธิภาพของการ decode เลขฐานสิบหก
- ใช้ตาราง
HEX เพื่อทำให้การ decode มีประสิทธิภาพ
- ผลลัพธ์การปรับปรุงประสิทธิภาพ: การ parse War and Peace ที่เข้ารหัสเป็น JSON เร็วขึ้น 21%
ผลลัพธ์สุดท้าย
- การปรับแต่งการเข้ารหัส UTF-8
- ลงมือ implement การเข้ารหัส UTF-8 โดยตรงแทนการใช้ฟังก์ชัน
char::encode_utf8
- ผลลัพธ์การปรับปรุงประสิทธิภาพ: การ parse War and Peace เร็วขึ้นเพิ่มอีก 9%
สรุปโดย GN⁺
- บทความนี้แชร์ประสบการณ์การเพิ่มประสิทธิภาพของ serde_json ซึ่งถูกใช้อย่างแพร่หลายใน ecosystem ของ Rust ให้ดีขึ้น 20%
- ระหว่างกระบวนการปรับแต่งประสิทธิภาพ มีการกล่าวถึงเทคนิคหลากหลายแบบและวิธีแก้ปัญหาต่าง ๆ
- การปรับแต่งยูนิโค้ดและการ parse สตริงช่วยยกระดับประสิทธิภาพการจัดการ JSON ได้อย่างมาก
- บทความนี้มีประโยชน์สำหรับนักพัฒนาที่สนใจการปรับแต่งประสิทธิภาพ และจะส่งผลเชิงบวกต่อ ecosystem ของ Rust โดยรวม
ยังไม่มีความคิดเห็น