فیسبوک منبع باز Cinder، فورکی از CPython که توسط اینستاگرام استفاده می شود

فیس بوک کد منبع Project Cinder را منتشر کرده است، فورکی از CPython 3.8.5، پیاده سازی مرجع اصلی زبان برنامه نویسی پایتون. Cinder در زیرساخت های تولید فیس بوک برای تقویت اینستاگرام استفاده می شود و شامل بهینه سازی هایی برای بهبود عملکرد است.

این کد برای بحث در مورد امکان انتقال بهینه سازی های آماده شده به چارچوب اصلی CPython و کمک به پروژه های دیگر درگیر در بهبود عملکرد CPython منتشر شده است. فیس بوک قصد ندارد از Cinder در قالب یک پروژه منبع باز جداگانه پشتیبانی کند و کد به شکلی که در زیرساخت های شرکت استفاده می شود، بدون شانه و مستندات اضافی ارائه می شود. آنها همچنین سعی نمی کنند Cinder را به عنوان جایگزینی برای CPython تبلیغ کنند - هدف اصلی توسعه، تمایل به بهبود خود CPython است.

کد Cinder به عنوان نسبتاً قابل اعتماد و آزمایش شده در محیط های تولید ذکر شده است، اما در صورت شناسایی مشکلات، باید خودتان آنها را حل کنید، زیرا فیس بوک تضمین نمی کند که به پیام های خطای خارجی پاسخ می دهد و درخواست ها را می کشد. در عین حال، فیس بوک همکاری سازنده با جامعه را مستثنی نمی کند و آماده است در مورد ایده هایی در مورد چگونگی سریعتر کردن Cinder یا چگونگی سرعت بخشیدن به انتقال تغییرات آماده شده به بخش اصلی CPython بحث کند.

بهینه سازی های اصلی پیاده سازی شده در Cinder:

  • ذخیره سازی درون خطی بایت کد ("بایت کد سایه"). ماهیت روش شناسایی موقعیت‌هایی است که در آن یک کد عملیاتی معمولی اجرا می‌شود که می‌تواند بهینه‌سازی شود، و جایگزینی پویا با گزینه‌های تخصصی سریع‌تر (به عنوان مثال، جایگزین کردن توابع اغلب نامیده می‌شود).
  • ارزشیابی همیشگی مشتاقانه برای فراخوانی‌های تابع غیر همگام که بلافاصله پردازش می‌شوند (انتظار منجر به انتظار نمی‌شود و تابع زودتر به دستور بازگشت می‌رسد)، نتیجه چنین توابعی مستقیماً بدون ایجاد کوروتین یا شامل حلقه رویداد جایگزین می‌شود. در کد فیس بوک که به شدت از async/wait استفاده می کند، بهینه سازی منجر به افزایش سرعت حدود 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 انتظار می رود، اما با در نظر گرفتن ویژگی های راه اندازی فرآیندها در اینستاگرام، کامپایل JIT در مرحله اولیه برای فیس بوک نیز مناسب است.

    JIT ابتدا بایت کد پایتون را به یک نمایش متوسط ​​سطح بالا (HIR) تبدیل می کند که تقریباً به بایت کد پایتون نزدیک است، اما برای استفاده از یک ماشین مجازی مبتنی بر ثبت به جای یک ماشین مبتنی بر پشته طراحی شده است و همچنین از اطلاعات نوع و اضافی استفاده می کند. جزئیات حیاتی عملکرد (مانند شمارش مرجع). سپس HIR به فرم SSA (تخصیص تک استاتیک) تبدیل می‌شود و مراحل بهینه‌سازی را طی می‌کند که نتایج شمارش مرجع و داده‌های مصرف حافظه را در نظر می‌گیرد. در نتیجه، یک نمایش متوسط ​​سطح پایین (LIR) نزدیک به زبان اسمبلی ایجاد می شود. پس از مرحله دیگری از بهینه سازی های مبتنی بر LIR، دستورالعمل های اسمبلی با استفاده از کتابخانه asmjit تولید می شوند.

  • حالت سختگیرانه برای ماژول ها عملکرد شامل سه جزء است: Type StrictModule. یک آنالایزر استاتیک که می تواند تعیین کند که اجرای یک ماژول هیچ تاثیری بر روی کد خارج از آن ماژول ندارد. لودر ماژول که تعیین می‌کند که ماژول‌ها در حالت سخت قرار دارند (کد «وارد کردن __strict__» را مشخص می‌کند)، عدم وجود تقاطع با ماژول‌های دیگر را بررسی می‌کند و ماژول‌های سخت‌گیرانه را در sys.modules به عنوان یک شی StrictModule بارگذاری می‌کند.
  • Static Python یک کامپایلر بایت کد تجربی است که از حاشیه نویسی نوع برای تولید بایت کد خاص استفاده می کند که به لطف کامپایل JIT سریعتر اجرا می شود. در برخی آزمایش‌ها، ترکیب Static Python و JIT بهبود عملکرد را تا 7 برابر در مقایسه با CPython استاندارد نشان می‌دهد. در بسیاری از موقعیت ها، نتایج نزدیک به استفاده از کامپایلرهای MyPyC و Cython تخمین زده می شود.

منبع: opennet.ru

اضافه کردن نظر