Facebook โอเพ่นซอร์ส Cinder ซึ่งเป็นทางแยกของ CPython ที่ Instagram ใช้

Facebook ได้เผยแพร่ซอร์สโค้ดสำหรับ Project Cinder ซึ่งเป็นทางแยกของ CPython 3.8.5 ซึ่งเป็นการใช้งานอ้างอิงหลักของภาษาการเขียนโปรแกรม Python Cinder ใช้ในโครงสร้างพื้นฐานการผลิตของ Facebook เพื่อขับเคลื่อน Instagram และรวมถึงการเพิ่มประสิทธิภาพเพื่อปรับปรุงประสิทธิภาพ

รหัสนี้ได้รับการเผยแพร่เพื่อหารือเกี่ยวกับความเป็นไปได้ในการย้ายการเพิ่มประสิทธิภาพที่เตรียมไว้ไปยังเฟรมเวิร์ก CPython หลัก และเพื่อช่วยโครงการอื่น ๆ ที่เกี่ยวข้องกับการปรับปรุงประสิทธิภาพของ CPython Facebook ไม่ได้ตั้งใจที่จะสนับสนุน Cinder ในรูปแบบของโครงการโอเพ่นซอร์สแยกต่างหาก และโค้ดจะถูกนำเสนอในรูปแบบที่ใช้ในโครงสร้างพื้นฐานของบริษัท โดยไม่ต้องรวมและจัดทำเอกสารเพิ่มเติม พวกเขาไม่พยายามส่งเสริม Cinder ให้เป็นทางเลือกแทน CPython - เป้าหมายหลักของการพัฒนาคือความปรารถนาที่จะปรับปรุง CPython เอง

รหัส Cinder ได้รับการระบุว่าค่อนข้างเชื่อถือได้และผ่านการทดสอบในสภาพแวดล้อมการใช้งานจริง แต่หากมีการระบุปัญหา คุณจะต้องแก้ไขด้วยตนเอง เนื่องจาก Facebook ไม่รับประกันว่าจะตอบสนองต่อข้อความแสดงข้อผิดพลาดภายนอกและดึงคำขอ ในเวลาเดียวกัน Facebook ไม่ได้แยกความร่วมมือเชิงสร้างสรรค์กับชุมชนและพร้อมที่จะหารือเกี่ยวกับแนวคิดในการทำให้ Cinder เร็วขึ้นหรือวิธีเร่งการถ่ายโอนการเปลี่ยนแปลงที่เตรียมไว้ไปยังส่วนหลักของ CPython

การเพิ่มประสิทธิภาพหลักที่นำมาใช้ใน Cinder:

  • การแคชแบบอินไลน์ของ bytecode (“shadow bytecode”) สาระสำคัญของวิธีการนี้คือการระบุสถานการณ์ที่มีการดำเนินการ opcode ทั่วไปที่สามารถปรับให้เหมาะสมได้ และเพื่อแทนที่ opcode ดังกล่าวแบบไดนามิกด้วยตัวเลือกพิเศษที่เร็วกว่า (เช่น การแทนที่ฟังก์ชันที่เรียกว่าบ่อยครั้ง)
  • การประเมินโครูทีนอย่างกระตือรือร้น สำหรับการเรียกใช้ฟังก์ชันอะซิงก์ที่ถูกประมวลผลทันที (การรอไม่ส่งผลให้เกิดการรอและฟังก์ชันไปถึงคำสั่ง return ก่อนหน้านี้) ผลลัพธ์ของฟังก์ชันดังกล่าวจะถูกแทนที่โดยตรงโดยไม่ต้องสร้างโครูทีนหรือเกี่ยวข้องกับลูปเหตุการณ์ ในโค้ด Facebook ที่ใช้ async/await อย่างมาก ผลลัพธ์การปรับให้เหมาะสมจะเร็วขึ้นประมาณ 5%
  • การรวบรวม JIT แบบเลือกสรรที่ระดับของวิธีการและฟังก์ชันแต่ละรายการ (วิธีการในแต่ละครั้ง) เปิดใช้งานผ่านตัวเลือก “-X jit” หรือตัวแปรสภาพแวดล้อม PYTHONJIT=1 และช่วยให้คุณเร่งความเร็วการดำเนินการทดสอบประสิทธิภาพหลายๆ รายการได้ 1.5-4 เท่า เนื่องจากการคอมไพล์ JIT เกี่ยวข้องเฉพาะกับฟังก์ชันที่ถูกเรียกใช้งานบ่อยเท่านั้น จึงไม่แนะนำให้ใช้กับฟังก์ชันที่ไม่ค่อยได้ใช้ ซึ่งค่าใช้จ่ายในการคอมไพล์อาจทำให้การทำงานของโปรแกรมช้าลงเท่านั้น

    ด้วยตัวเลือก “-X jit-list-file=/path/to/jitlist.txt” หรือตัวแปรสภาพแวดล้อม “PYTHONJITLISTFILE=/path/to/jitlist.txt” คุณสามารถระบุไฟล์ด้วยรายการฟังก์ชันที่ JIT สามารถใช้ได้ (รูปแบบพาธ .to.module:funcname หรือ path.to.module:ClassName.method_name) รายการฟังก์ชันที่ควรเปิดใช้งาน JIT สามารถกำหนดได้จากผลการทำโปรไฟล์ ในอนาคต คาดว่าจะรองรับการคอมไพล์ JIT แบบไดนามิกโดยอิงจากการวิเคราะห์ภายในของความถี่ของการเรียกใช้ฟังก์ชัน แต่เมื่อคำนึงถึงลักษณะเฉพาะของกระบวนการเปิดตัวบน Instagram แล้ว การคอมไพล์ JIT ก็เหมาะสำหรับ Facebook ในระยะเริ่มต้นเช่นกัน

    JIT จะแปลงรหัสไบต์ Python เป็นการแสดงระดับกลางระดับสูง (HIR) ซึ่งค่อนข้างใกล้เคียงกับรหัสไบต์ Python แต่ได้รับการออกแบบเพื่อใช้เครื่องเสมือนที่ลงทะเบียนแทนเครื่องที่ใช้สแต็ก และยังใช้ข้อมูลประเภทและข้อมูลเพิ่มเติม รายละเอียดที่สำคัญต่อประสิทธิภาพ (เช่น การนับการอ้างอิง) จากนั้น HIR จะถูกแปลงเป็นรูปแบบ SSA (การมอบหมายงานเดี่ยวแบบคงที่) และดำเนินการตามขั้นตอนการปรับให้เหมาะสมโดยคำนึงถึงผลการนับการอ้างอิงและข้อมูลการใช้หน่วยความจำ เป็นผลให้มีการสร้างการแสดงระดับกลางระดับต่ำ (LIR) ใกล้กับภาษาแอสเซมบลี หลังจากการปรับให้เหมาะสมตาม LIR อีกระยะหนึ่ง คำแนะนำการประกอบจะถูกสร้างขึ้นโดยใช้ไลบรารี asmjit

  • โหมดเข้มงวดสำหรับโมดูล ฟังก์ชันการทำงานประกอบด้วยสามองค์ประกอบ: ประเภท StrictModule เครื่องวิเคราะห์แบบคงที่ที่สามารถระบุได้ว่าการทำงานของโมดูลไม่มีผลกระทบต่อโค้ดภายนอกโมดูลนั้น ตัวโหลดโมดูลที่กำหนดว่าโมดูลอยู่ในโหมดเข้มงวด (โค้ดระบุ “import __strict__”) ตรวจสอบว่าไม่มีจุดตัดกับโมดูลอื่นๆ และโหลดโมดูลที่เข้มงวดลงใน sys.modules เป็นอ็อบเจ็กต์ StrictModule
  • Static Python เป็นคอมไพเลอร์โค้ดไบต์รุ่นทดลองที่ใช้คำอธิบายประกอบประเภทเพื่อสร้างโค้ดไบต์เฉพาะประเภทที่ทำงานเร็วขึ้นเนื่องจากการคอมไพล์ JIT ในการทดสอบบางอย่าง การรวมกันของ Static Python และ JIT แสดงให้เห็นถึงการปรับปรุงประสิทธิภาพสูงสุดถึง 7 เท่าเมื่อเทียบกับ CPython มาตรฐาน ในหลายสถานการณ์ ผลลัพธ์คาดว่าจะใกล้เคียงกับการใช้คอมไพเลอร์ MyPyC และ Cython

ที่มา: opennet.ru

เพิ่มความคิดเห็น