Facebook သည် Instagram မှအသုံးပြုသော CPython ၏လမ်းဆုံတစ်ခုဖြစ်သည့် Cinder ဖြစ်သည်။

Facebook သည် Python ပရိုဂရမ်းမင်းဘာသာစကား၏ အဓိကကိုးကားချက်ဖြစ်သော CPython 3.8.5 ၏လမ်းဆုံဖြစ်သော Project Cinder အတွက် အရင်းအမြစ်ကုဒ်ကို ထုတ်ဝေခဲ့သည်။ Cinder သည် Instagram ကို အားဖြည့်ရန်အတွက် Facebook ၏ ထုတ်လုပ်မှု အခြေခံအဆောက်အအုံတွင် အသုံးပြုထားပြီး စွမ်းဆောင်ရည်ကို မြှင့်တင်ရန် အကောင်းဆုံးပြင်ဆင်မှုများ ပါဝင်သည်။

CPython စွမ်းဆောင်ရည်ကို မြှင့်တင်ရာတွင် ပါဝင်သော အခြားပရောဂျက်များကို ကူညီပေးရန်အတွက် ပြင်ဆင်ထားသော ပိုမိုကောင်းမွန်အောင်လုပ်ဆောင်မှုများကို ပင်မ CPython မူဘောင်သို့ ပေးပို့နိုင်ခြေကို ဆွေးနွေးရန်အတွက် ကုဒ်ကို ထုတ်ဝေထားပါသည်။ Facebook သည် သီးခြား open source ပရောဂျက်ပုံစံဖြင့် Cinder ကို ပံ့ပိုးရန် ရည်ရွယ်ထားခြင်း မဟုတ်ဘဲ ကုဒ်ကို ကုမ္ပဏီ၏ အခြေခံအဆောက်အအုံများတွင် အသုံးပြုသည့်ပုံစံဖြင့် ဖြည့်စွက်ထားခြင်း၊ စာရွက်စာတမ်းများနှင့် ပေါင်းစပ်ထားခြင်းမရှိဘဲ၊ ၎င်းတို့သည် Cinder ကို CPython ၏အခြားရွေးချယ်စရာအဖြစ်မြှင့်တင်ရန်မကြိုးစားပါ - ဖွံ့ဖြိုးတိုးတက်မှု၏အဓိကပန်းတိုင်မှာ CPython ကိုယ်တိုင်တိုးတက်လိုသောဆန္ဒဖြစ်သည်။

Cinder ကုဒ်ကို ထုတ်လုပ်မှုပတ်ဝန်းကျင်တွင် စမ်းသပ်ပြီး အတော်အတန် ယုံကြည်စိတ်ချရသည်ဟု မှတ်သားထားသော်လည်း ပြဿနာများကို ရှာဖွေတွေ့ရှိပါက၊ Facebook က ပြင်ပအမှားမက်ဆေ့ချ်များနှင့် တောင်းဆိုချက်များကို ဆွဲထုတ်မည်ဟု အာမမခံနိုင်သောကြောင့် ၎င်းတို့ကို သင်ကိုယ်တိုင် ဖြေရှင်းရမည်ဖြစ်သည်။ တစ်ချိန်တည်းမှာပင် Facebook သည် အသိုင်းအဝိုင်းနှင့် အပြုသဘောဆောင်သော ပူးပေါင်းဆောင်ရွက်မှုများကို ဖယ်ထုတ်မထားဘဲ Cinder ကို ပိုမိုမြန်ဆန်အောင်ပြုလုပ်နည်း သို့မဟုတ် CPython ၏ အဓိကအစိတ်အပိုင်းသို့ ပြင်ဆင်ထားသော အပြောင်းအလဲများကို မည်ကဲ့သို့ အရှိန်မြှင့်ရမည်ကို ဆွေးနွေးရန် အဆင်သင့်ဖြစ်နေပါပြီ။

Cinder တွင် လုပ်ဆောင်ခဲ့သော အဓိက ပိုမိုကောင်းမွန်အောင် လုပ်ဆောင်ချက်များ-

  • bytecode ၏ အတွင်းပိုင်း သိမ်းဆည်းခြင်း (“shadow bytecode”)။ နည်းလမ်း၏ အနှစ်သာရမှာ အကောင်းဆုံးဖြစ်အောင် လုပ်ဆောင်နိုင်သည့် ပုံမှန် opcode ကို လုပ်ဆောင်သည့် အခြေအနေများကို ခွဲခြားသတ်မှတ်ရန်နှင့် ထိုကဲ့သို့သော opcode ကို ပိုမိုမြန်ဆန်သော အထူးပြုရွေးချယ်စရာများဖြင့် အစားထိုးရန်ဖြစ်သည် (ဥပမာ၊ မကြာခဏခေါ်သော လုပ်ဆောင်ချက်များကို အစားထိုးခြင်း)။
  • စိတ်အားထက်သန်စွာ ပုံမှန်အကဲဖြတ်ခြင်း။ ချက်ခြင်းလုပ်ဆောင်သော async လုပ်ဆောင်ချက်ခေါ်ဆိုမှုများအတွက် (စောင့်ဆိုင်းခြင်းသည် စောင့်ဆိုင်းမှုရလဒ်မဟုတ်ပါ၊ လုပ်ဆောင်ချက်သည် စောစောပိုင်းပြန်စာထုတ်ပြန်ချက်သို့ရောက်ရှိသည်)၊ ထိုလုပ်ဆောင်ချက်များ၏ရလဒ်သည် coroutine မဖန်တီးဘဲ သို့မဟုတ် event loop မပါဝင်ဘဲ တိုက်ရိုက်အစားထိုးပါသည်။ async/aawait ကို ပြင်းပြင်းထန်ထန်အသုံးပြုသည့် Facebook ကုဒ်တွင်၊ ပိုမိုကောင်းမွန်အောင်ပြုလုပ်ခြင်းက 5% ခန့် အရှိန်မြှင့်ပေးသည်။
  • တစ်ဦးချင်းနည်းလမ်းများနှင့် လုပ်ဆောင်ချက်များ (method-at-a-time) အဆင့်တွင် ရွေးချယ်ထားသော JIT စုစည်းမှု။ “-X jit” ရွေးချယ်မှု သို့မဟုတ် PYTHONJIT=1 ပတ်၀န်းကျင် ပြောင်းလဲနိုင်သော အသွင်အပြင်မှတစ်ဆင့် ဖွင့်ထားပြီး စွမ်းဆောင်ရည်စစ်ဆေးမှုများစွာကို 1.5-4 ကြိမ် အရှိန်မြှင့်လုပ်ဆောင်နိုင်စေပါသည်။ JIT compilation သည် မကြာခဏ executed functions များအတွက်သာ သက်ဆိုင်သောကြောင့်၊ အသုံးနည်းသော function များအတွက် ၎င်းကို အသုံးပြုရန် အကြံပြုလိုသည်မှာ၊ compilation overhead သည် program execution ကိုသာ နှေးကွေးသွားစေနိုင်ပါသည်။

    ရွေးချယ်စရာ “-X jit-list-file=/path/to/jitlist.txt” သို့မဟုတ် ပတ်၀န်းကျင်ပြောင်းလဲနိုင်သော “PYTHONJITLISTFILE=/path/to/jitlist.txt” မှတစ်ဆင့် JIT အတွက် လုပ်ဆောင်ချက်များစာရင်းနှင့်အတူ ဖိုင်တစ်ခုကို သင်သတ်မှတ်နိုင်ပါသည်။ အသုံးပြုနိုင်သည်။ (လမ်းကြောင်းဖော်မတ် .to.module:funcname သို့မဟုတ် path.to.module:ClassName.method_name)။ JIT ကိုဖွင့်ထားသင့်သည့် လုပ်ဆောင်ချက်များစာရင်းကို ပရိုဖိုင်ပြုလုပ်ခြင်းရလဒ်များအပေါ် အခြေခံ၍ ဆုံးဖြတ်နိုင်သည်။ အနာဂတ်တွင်၊ လုပ်ဆောင်ချက်ခေါ်ဆိုမှုအကြိမ်ရေ၏အတွင်းပိုင်းခွဲခြမ်းစိတ်ဖြာမှုအပေါ်အခြေခံ၍ Dynamic JIT စုစည်းမှုအတွက်ပံ့ပိုးမှုကိုမျှော်လင့်ထားသော်လည်း Instagram တွင်စတင်သည့်လုပ်ငန်းစဉ်များ၏အသေးစိတ်အချက်အလက်များကိုထည့်သွင်းစဉ်းစားခြင်းဖြင့် JIT စုစည်းမှုသည်ကနဦးအဆင့်တွင် Facebook အတွက်လည်းသင့်လျော်သည်။

    JIT သည် ပထမဦးစွာ Python bytecode ကို Python bytecode နှင့် အတော်လေးနီးစပ်သည့် မြင့်မားသောအဆင့် အလယ်အလတ်ကိုယ်စားပြုမှု (HIR) အဖြစ်သို့ ပြောင်းလဲသော်လည်း stack-based တစ်ခုအစား မှတ်ပုံတင်အခြေခံ virtual machine ကို အသုံးပြုရန် ဒီဇိုင်းထုတ်ထားပြီး အမျိုးအစားအချက်အလက်နှင့် အပိုဆောင်းအချက်အလက်များကိုလည်း အသုံးပြုပါသည်။ စွမ်းဆောင်ရည်-အရေးပါသောအသေးစိတ်အချက်များ (ကိုးကားရေတွက်ခြင်းကဲ့သို့သော)။ ထို့နောက် HIR ကို SSA (static single assignment) ပုံစံသို့ ပြောင်းလဲပြီး ကိုးကားရေတွက်ခြင်းရလဒ်များနှင့် မှတ်ဉာဏ်သုံးစွဲမှုဒေတာကို ထည့်သွင်းစဉ်းစားသည့် ပိုမိုကောင်းမွန်အောင်ပြုလုပ်ခြင်းအဆင့်များမှတစ်ဆင့် လုပ်ဆောင်သည်။ ရလဒ်အနေဖြင့်၊ အဆင့်နိမ့် အလယ်အလတ်ကိုယ်စားပြုမှု (LIR) ကို စုစည်းမှုဘာသာစကားနှင့် နီးကပ်စွာ ထုတ်ပေးပါသည်။ LIR-based optimizations ၏နောက်ထပ်အဆင့်ပြီးနောက်၊ asmjit စာကြည့်တိုက်ကို အသုံးပြု၍ စုစည်းမှုညွှန်ကြားချက်များကို ထုတ်ပေးပါသည်။

  • မော်ဂျူးများအတွက် တင်းကျပ်သောမုဒ်။ လုပ်ဆောင်နိုင်စွမ်းတွင် StrictModule ဟုရိုက်ထည့်ပါ။ module တစ်ခု၏လုပ်ဆောင်မှုသည်ထို module ၏အပြင်ဘက်ရှိ code များအပေါ်အကျိုးသက်ရောက်မှုမရှိကြောင်းဆုံးဖြတ်နိုင်သည့်တည်ငြိမ်သောခွဲခြမ်းစိတ်ဖြာမှုတစ်ခုဖြစ်သည်။ မော်ဂျူးများသည် တင်းကျပ်သောမုဒ်တွင် ရှိနေကြောင်း ဆုံးဖြတ်သည့် မော်ဂျူး loader (ကုဒ်သည် “import __strict__” ကို သတ်မှတ်သည်)၊ အခြား module များနှင့် လမ်းဆုံများမရှိခြင်းအတွက် စစ်ဆေးပြီး StrictModule အရာဝတ္ထုအဖြစ် sys.modules အတွင်းသို့ တင်းကျပ်သော module များကို load လုပ်ပါသည်။
  • Static Python သည် JIT compilation ကြောင့် ပိုမိုမြန်ဆန်စွာ လုပ်ဆောင်နိုင်သော အမျိုးအစား-သီးသန့် bytecode များကို ထုတ်လုပ်ရန် အမျိုးအစားမှတ်စာများကို အသုံးပြုသည့် စမ်းသပ်ဆဲ bytecode compiler တစ်ခုဖြစ်သည်။ အချို့သောစမ်းသပ်မှုများတွင်၊ Static Python နှင့် JIT ပေါင်းစပ်မှုသည် စံ CPython ထက် 7 ဆအထိ စွမ်းဆောင်ရည်တိုးတက်မှုကို ပြသသည်။ အခြေအနေများစွာတွင်၊ ရလဒ်များသည် MyPyC နှင့် Cython compilers များကို အသုံးပြုခြင်းနှင့် နီးစပ်သည်ဟု ခန့်မှန်းရသည်။

source: opennet.ru

မှတ်ချက် Add