- คอมไพเลอร์ 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 เป็นผลลัพธ์จากการผสานกันของ ความร่วมมือจากชุมชน การทดลองทางเทคนิค และการปรับปรุงโครงสร้างพื้นฐาน
- สิ่งนี้พิสูจน์ว่า ผู้คน โชค และวัฒนธรรมการทำงานร่วมกัน คือแรงขับเคลื่อนสำคัญของนวัตกรรมด้านประสิทธิภาพในโอเพนซอร์ส
ยังไม่มีความคิดเห็น