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

Java菜分享發表於2019-03-15

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次。


JavaScript 引擎 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 版本中使用。

歡迎工作一到五年的Java工程師朋友們加入Java程式設計師開發: 721575865

群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!



相關文章