JS 引擎 V8 新機制:JIT-less 模式

來源 | 開源中國原文 | https://v8.dev/blog/jitless

V8 v7.4 現在支持無需在 runtime 階段分配可執行內存就能執行 JavaScript 代碼。

在其默認配置中,V8 很大程度上依賴於在 runtime 階段分配和修改可執行內存的能力。例如,作為一個包含優化過程的編譯器,TurboFan 可即時(just-in-time)為熱加載 JavaScript(JS) 函數創建原生代碼,並且大多數 JS 正則表達式由 irregexp 引擎編譯為原生代碼。而在 runtime 階段支持創建可執行內存正是 V8 快速運行的原因之一。

但在某些場景中,我們可能需要剛好需要在不分配可執行內存的情況下運行 V8:

  1. 某些平臺(例如 iOS、智能電視、遊戲控制檯)禁止對非特權應用程序的可執行內存進行寫訪問,因此到目前為止,在這些平臺上一直無法使用 V8
  2. 禁止對可執行內存進行寫操作可減少應用程序的攻擊面

為此,V8 引入了名為 "JIT-less" 的新模式,旨在解決上面這些問題。當 V8 啟動時帶上 --jitless 參數,它就可以在沒有使用任何 runtime 的情況下(無需分配可執行內存)來運行。

到這裡,可能有人會問,這個 "JIT-less" 的工作原理到底是什麼?對此,官方給出瞭解釋。本質上,V8 只是基於現有的技術切換到了僅使用解釋器(interpreter-only)模式:

所有 JS 代碼都通過 Ignition 解釋器運行,同時對正則表達式模式匹配進行解釋。雖然目前暫不支持 WebAssembly,不過可以對其進行解釋。

而對於 V8 的內置程序,仍會將其編譯為原生代碼。但開發團隊表示最近正努力將這些內置程序嵌入到 V8 二進制文件中,所以它們以後不再是 JS 堆棧。

最後,這些變更使得開發者所創建的 V8 不需要在任何內存區域申請可執行權限。

測試結果

正如上文所提到的,由於在 JIT-less 模式下禁用了優化編譯器,因此會降低性能。

為此,開發團隊研究了各種基準測試,以更好了解 V8 的性能是如何變化的。本次測試的比較對象包括:Speedometer 2.0、Web Tooling Benchmark 以及 YouTube TV Browsing

Speedometer 2.0 旨在代表典型的 Web 應用程序;Web Tooling Benchmark 包含了一系列常見的 JS 開發者工具;此外還提供了一個模擬在 Youtube 直播間瀏覽的基準測試。所有測試均在 x64 Linux 桌面系統上本地進行,運行次數超過5次。


JS 引擎 V8 新機制:JIT-less 模式


△分數越高越好

可以看到,在 JIT-less 模式下,Speedometer 2.0 的性能大概下降了 40%。其中禁用的優化編譯器佔了大約一半的原因,另一半原因則是由正則表達式解釋器引起的,該解釋器最初用作調試輔助工具。

由於 Web Tooling Benchmark 會在 TurboFan 中花費更多時間,即它會重度依賴 TurboFan,因此在啟用 JIT-less 模式後,測試結果顯示下降了大約 80%。

對於最後的測試對象,可以看到性能變化不大。其測試過程包括視頻播放和菜單導航,所以即使在 JIT-less 模式下,嵌入器也可以保持合理的性能。

最後,開發團隊鼓勵在受限制的平臺或具有特殊安全要求的場景中嘗試使用 V8 的新 JIT-less 模式,現在可在 V8 v7.4 版本中使用。

希望能給大家帶來收穫,如果覺得有收穫歡迎轉發+關注+評論666。你們的支持是我更新最大的動力!


分享到:


相關文章: