แชร์ประสบการณ์การปรับปรุงประสิทธิภาพของ 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 โดยรวม

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น