Facebook ашық бастапқы коды бар Cinder, Instagram пайдаланатын CPython шанышқысы

Facebook Python бағдарламалау тілінің негізгі анықтамалық іске асырылуы болып табылатын CPython 3.8.5 шанышқысы Project Cinder үшін бастапқы кодты жариялады. Cinder Instagram-ды қуаттандыру үшін Facebook-тің өндірістік инфрақұрылымында қолданылады және өнімділікті жақсарту үшін оңтайландыруларды қамтиды.

Код дайындалған оңтайландыруларды негізгі CPython құрылымына тасымалдау мүмкіндігін талқылау және CPython өнімділігін жақсартуға қатысатын басқа жобаларға көмектесу үшін жарияланады. Facebook Cinder-ді бөлек ашық бастапқы жоба түрінде қолдауға ниетті емес және код қосымша тарақ пен құжаттамасыз компанияның инфрақұрылымында қолданылатын пішінде ұсынылған. Олар сондай-ақ Cinder-ді CPython-ға балама ретінде алға жылжытуға тырыспайды - дамудың негізгі мақсаты - CPython-ның өзін жақсартуға деген ұмтылыс.

Cinder коды жеткілікті сенімді және өндірістік орталарда сыналған, бірақ проблемалар анықталса, оларды өзіңіз шешуге тура келеді, өйткені Facebook сыртқы қате туралы хабарларға және сұрауларды қабылдауға жауап беретініне кепілдік бермейді. Сонымен қатар, Facebook қауымдастықпен конструктивті ынтымақтастықты жоққа шығармайды және Cinder-ді қалай тезірек жасауға болады немесе CPython негізгі бөлігіне дайындалған өзгерістерді қалай жылдам тасымалдауға болатыны туралы идеяларды талқылауға дайын.

Cinder-де енгізілген негізгі оңтайландырулар:

  • Байт-кодты кірістірілген кэштеу («көлеңкелі байт код»). Әдістің мәні оңтайландыруға болатын типтік операциялық код орындалатын жағдайларды анықтау және мұндай операциялық кодты жылдамырақ арнайы опциялармен динамикалық түрде ауыстыру (мысалы, жиі шақырылатын функцияларды ауыстыру).
  • Ыңғайлы корутиндік бағалау. Бірден өңделетін асинхронды функция шақырулары үшін (күту күтуге әкелмейді және функция қайтару операторына ертерек жетеді), мұндай функциялардың нәтижесі корутин жасамай немесе оқиғалар циклін қоспай тікелей ауыстырылады. Асинхронды/күтуді көп пайдаланатын Facebook кодында оңтайландыру шамамен 5% жылдамдыққа әкеледі.
  • Жеке әдістер мен функциялар деңгейінде таңдамалы JIT компиляциясы (бір уақытта әдіс). “-X jit” опциясы немесе PYTHONJIT=1 орта айнымалысы арқылы қосылған және көптеген өнімділік сынақтарының орындалуын 1.5-4 есе жылдамдатуға мүмкіндік береді. JIT компиляциясы тек жиі орындалатын функцияларға қатысты болғандықтан, оны сирек қолданылатын функциялар үшін пайдалану ұсынылмайды, компиляцияға қосымша шығындар тек бағдарламаның орындалуын баяулатуы мүмкін.

    “-X jit-list-file=/path/to/jitlist.txt” опциясы немесе “PYTHONJITLISTFILE=/path/to/jitlist.txt” айнымалысы арқылы JIT болатын функциялар тізімі бар файлды көрсетуге болады. пайдалануға болады (жол пішімі .модульге:функатына немесе модульге.жолға:СыныпАты.әдіс_аты). JIT қосу керек функциялар тізімін профильдеу нәтижелері негізінде анықтауға болады. Болашақта динамикалық JIT компиляциясын қолдау функционалдық шақырулар жиілігін ішкі талдау негізінде күтілуде, бірақ Instagram-да іске қосу процестерінің ерекшеліктерін ескере отырып, JIT компиляциясы бастапқы кезеңде Facebook үшін де қолайлы.

    JIT алдымен Python байт кодын жоғары деңгейлі аралық өкілдікке (HIR) түрлендіреді, ол Python байт кодына өте жақын, бірақ стек негізіндегі емес, регистр негізіндегі виртуалды машинаны пайдалануға арналған, сонымен қатар типтік ақпаратты және қосымша ақпаратты пайдаланады. өнімділікке қатысты маңызды мәліметтер (анықтамаларды санау сияқты). Содан кейін HIR SSA (статикалық жалғыз тағайындау) пішіміне түрлендіріледі және анықтамалық санау нәтижелері мен жад тұтыну деректерін есепке алатын оңтайландыру қадамдарынан өтеді. Нәтижесінде ассемблер тіліне жақын төменгі деңгейлі аралық өкілдік (LIR) жасалады. LIR негізіндегі оңтайландырудың басқа кезеңінен кейін asmjit кітапханасы арқылы құрастыру нұсқаулары жасалады.

  • Модульдер үшін қатаң режим. Функционалдық үш құрамдас бөлікті қамтиды: Type StrictModule. Модульдің орындалуы осы модульден тыс кодқа әсер етпейтінін анықтай алатын статикалық анализатор. Модульдердің қатаң режимде екенін анықтайтын модуль жүктеушісі (код «импорт __strict__» көрсетеді), басқа модульдермен кедергілерді тексереді және қатаң модульдерді StrictModule нысаны ретінде sys.modules ішіне жүктейді.
  • Static Python — JIT компиляциясының арқасында жылдамырақ жұмыс істейтін түрге тән байт кодты жасау үшін типтік аннотацияларды пайдаланатын тәжірибелік байт код құрастырушы. Кейбір сынақтарда Static Python және JIT тіркесімі стандартты CPython бағдарламасымен салыстырғанда өнімділікті 7 есеге дейін жақсартуды көрсетеді. Көптеген жағдайларда нәтижелер MyPyC және Cython компиляторларын қолдануға жақын деп бағаланады.

Ақпарат көзі: opennet.ru

пікір қалдыру