• คอมไพเลอร์ JIT ของ CPython ทำความเร็วได้เพิ่มขึ้น 11~12% บน macOS AArch64 และ 5~6% บน x86_64 Linux บรรลุเป้าหมายได้เร็วกว่าที่คาด
  • ในเวอร์ชัน 3.13~3.14 JIT ช้ากว่าอินเทอร์พรีเตอร์ แต่ด้วย การพัฒนาที่ขับเคลื่อนโดยชุมชนและการปรับปรุงโครงสร้าง ทำให้ประสิทธิภาพดีขึ้นอย่างมาก
  • ความพยายามเชิงทดลองอย่าง trace recording และ reference count elimination เป็นจุดเปลี่ยนสำคัญ
  • ผู้มีส่วนร่วมหลักอย่าง Savannah Ostrowski, Mark Shannon, Diego Russo, Brandt Bucher และผู้เข้าร่วมหน้าใหม่จำนวนมากได้ร่วมมือกัน
  • ความสำเร็จครั้งนี้แสดงให้เห็นว่า การพัฒนาที่นำโดยชุมชนและวัฒนธรรมการทำงานร่วมกัน สามารถสร้างผลลัพธ์ที่เป็นรูปธรรมต่อการปรับปรุงประสิทธิภาพของโอเพนซอร์สได้

สถานะการปรับปรุงประสิทธิภาพของ CPython JIT

  • บันทึกประสิทธิภาพที่เร็วขึ้น 11~12% บน macOS AArch64 และ 5~6% บน x86_64 Linux
    • ค่าที่วัดเป็นค่าเฉลี่ยเรขาคณิต และในบางเบนช์มาร์กมีความแตกต่างตั้งแต่ ช้าลง 20% ไปจนถึงเร็วขึ้นมากกว่า 100%
    • ขณะนี้ การรองรับ free-threading ยังไม่สมบูรณ์ โดยตั้งเป้าไว้ในเวอร์ชัน 3.15/3.16
  • JIT ในเวอร์ชัน 3.13~3.14 ช้ากว่าอินเทอร์พรีเตอร์ แต่ในเวอร์ชันนี้ทำได้ เร็วขึ้นอย่างมีนัยสำคัญ

การพัฒนา JIT ที่ขับเคลื่อนโดยชุมชน

  • หลังจาก การสนับสนุนหลักของทีม Faster CPython ถูกยุติลง ในปี 2025 ก็เปลี่ยนผ่านสู่ระบบการพัฒนาที่นำโดยชุมชน
    • เป้าหมาย: ปรับปรุง 5% ใน 3.15, ปรับปรุง 10% และรองรับ free-threading ใน 3.16
    • เพื่อ ลด bus factor จึงมีผู้ดูแลอย่างน้อย 2 คนในแต่ละขั้นตอน (frontend, middle-end, backend)
  • แบ่งปัญหาที่ซับซ้อนออกเป็นงานย่อยเพื่อดึงดูดผู้มีส่วนร่วมหน้าใหม่
    • Brandt Bucher แยกหน่วยงานผ่าน ‘mega-issues’
    • ผู้มีส่วนร่วม 11 คนได้แปลงคำสั่งของอินเทอร์พรีเตอร์ให้เป็นมิตรต่อการเพิ่มประสิทธิภาพของ JIT
  • วัฒนธรรมการสนับสนุนผู้มีส่วนร่วมและการแบ่งปันความสำเร็จ ช่วยให้การมีส่วนร่วมดำเนินต่อเนื่อง
    • ส่งผลให้ประสิทธิภาพบน x86_64 Linux ดีขึ้นจาก 1% → 3~4%

จุดเปลี่ยนทางเทคนิคสำคัญ

trace recording

  • ใน CPython core sprint มีการเปลี่ยนไปใช้ frontend แบบ tracing-based
    • ในช่วงแรกช้าลง 6% แต่ประสิทธิภาพดีขึ้นหลังนำโครงสร้าง dual dispatch มาใช้
    • รักษา ความเร็วของอินเทอร์พรีเตอร์พื้นฐาน ไว้ได้ พร้อมลดการเพิ่มขนาดของอินเทอร์พรีเตอร์ให้น้อยที่สุด
  • การนำ trace recording มาใช้ทำให้ coverage ของโค้ด JIT เพิ่มขึ้น 50% และหลังจากนั้นประสิทธิภาพของการปรับแต่งก็ดีขึ้น

reference count elimination

  • ได้แนวคิดมาจากงานปรับแต่งไบต์โค้ดของ Matt Page
    • เพิ่มประสิทธิภาพด้วยการตัด branch ที่เกิดขึ้นเมื่อ reference count ลดลง
    • พบว่าแม้เพียงการตัด branch เดียวก็ช่วยลดต้นทุนสะสมได้
  • ทำงานแบบขนานได้ง่าย และยังถูกใช้เป็น โจทย์สำหรับการเรียนรู้โครงสร้าง JIT เพื่อฝึกผู้มีส่วนร่วมหน้าใหม่

โครงสร้างพื้นฐานและทีม

  • Savannah Ostrowski ดูแลโครงสร้างพื้นฐานสำหรับวัดประสิทธิภาพ JIT ด้วยเครื่อง 4 เครื่อง
    • ผลการรัน JIT รายวันช่วยให้ตรวจจับ performance regression ได้ตั้งแต่เนิ่น ๆ
  • Diego Russo รับผิดชอบการปรับปรุง JIT สำหรับฮาร์ดแวร์ ARM และความเข้ากันได้กับ profiler
  • Brandt Bucher วางรากฐานของ machine code backend เพื่อลดอุปสรรคในการเริ่มต้นของผู้มีส่วนร่วมหน้าใหม่

ความร่วมมือและการแลกเปลี่ยนความรู้

  • ได้รับคำแนะนำเกี่ยวกับ PyPy จาก CF Bolz-Tereick ทำให้ความเข้าใจด้านการออกแบบ JIT ดีขึ้น
  • การแลกเปลี่ยนกับผู้เชี่ยวชาญด้านคอมไพเลอร์อย่าง Max Bernstein ช่วยให้เกิด แรงจูงใจอย่างต่อเนื่องและการเติบโตทางเทคนิค
  • ประสบการณ์จากการวิเคราะห์โค้ดของ PyPy ช่วย ยกระดับคุณภาพของ CPython JIT

บทสรุป

  • JIT ของ Python 3.15 เป็นผลลัพธ์จากการผสานกันของ ความร่วมมือจากชุมชน การทดลองทางเทคนิค และการปรับปรุงโครงสร้างพื้นฐาน
  • สิ่งนี้พิสูจน์ว่า ผู้คน โชค และวัฒนธรรมการทำงานร่วมกัน คือแรงขับเคลื่อนสำคัญของนวัตกรรมด้านประสิทธิภาพในโอเพนซอร์ส

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

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