Facebook 開源了 Cinder,這是 Instagram 使用的 CPython 的一個分支

Facebook 發布了 Cinder 專案的源代碼,它是 CPython 3.8.5 的一個分支,CPython 是 Python 程式語言的主要參考實作。 Cinder 在 Facebook 的生產基礎設施中用於為 Instagram 提供支持,並包括提高效能的最佳化。

發布該程式碼是為了討論將準備好的最佳化移植到主要 CPython 框架的可能性,並幫助其他涉及提高 CPython 效能的專案。 Facebook 並不打算以單獨的開源專案的形式支援 Cinder,程式碼以在公司基礎設施中使用的形式呈現,無需額外的梳理和文件。 他們也沒有試圖推廣 Cinder 作為 CPython 的替代品——開發的主要目標是改進 CPython 本身的願望。

Cinder 程式碼被認為相當可靠,並在生產環境中進行了測試,但如果發現問題,您將必須自己解決它們,因為 Facebook 不保證它將回應外部錯誤訊息和拉取請求。 同時,Facebook 不排除與社群進行建設性合作,並準備討論如何讓 Cinder 更快或如何加快將準備好的變更轉移到 CPython 主要部分的想法。

Cinder 中實現的主要最佳化:

  • 字節碼的內聯快取(“影子字節碼”)。 該方法的本質是識別執行可優化的典型操作碼的情況,並用更快的專用選項動態替換此類操作碼(例如,替換頻繁調用的函數)。
  • 急切的協程評估。 對於立即處理的非同步函數呼叫(await 不會導致等待,且函數會更早到達 return 語句),此類函數的結果會直接替換,而無需建立協程或涉及事件循環。 在大量使用 async/await 的 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 函數清單的檔案可以使用(路徑格式.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__」),檢查是否不存在與其他模組的交集,並將嚴格模組作為 StrictModule 物件載入到 sys.modules 中。
  • 靜態 Python 是一種實驗性字節碼編譯器,它使用類型註釋來產生特定於類型的字節碼,由於 JIT 編譯,該字節碼運行速度更快。 在某些測試中,靜態 Python 和 JIT 的組合與標準 CPython 相比,效能提升高達 7 倍。 在許多情況下,估計結果與使用 MyPyC 和 Cython 編譯器接近。

來源: opennet.ru

添加評論