讓 V8 提前準備:利用顯式編譯提示加速 JavaScript 啟動
讓 JavaScript 更快速運行是提供響應性網頁應用的關鍵。即使 V8 有先進的優化技術,在啟動期間解析和編譯關鍵 JavaScript 仍然可能成為性能瓶頸。能夠在初始腳本編譯過程中確定需編譯的 JavaScript 函數,有助於加速網頁載入。
讓 JavaScript 更快速運行是提供響應性網頁應用的關鍵。即使 V8 有先進的優化技術,在啟動期間解析和編譯關鍵 JavaScript 仍然可能成為性能瓶頸。能夠在初始腳本編譯過程中確定需編譯的 JavaScript 函數,有助於加速網頁載入。
V8 的終極優化編譯器 Turbofan,是少數採用節點之海 (Sea of Nodes, SoN)的大規模生產編譯器之一。然而,自從大約三年前,我們開始逐步淘汰節點之海,轉而使用更傳統的控制流圖 (CFG) 中間表示 (IR),我們將其命名為 Turboshaft。目前為止,Turbofan 的整個 JavaScript 後端已完全採用了 Turboshaft,而 WebAssembly 在其整個管線中也完全使用了 Turboshaft。Turbofan 的兩個部分仍然使用一些節點之海:內建管線(我們正在逐步用 Turboshaft 替代)以及 JavaScript 管線的前端(我們正用另一個基於 CFG 的 IR,名為 Maglev 替代)。這篇博文將解釋我們放棄節點之海的原因。
在 V8,我們不斷努力提升 JavaScript 的性能。作為這一努力的一部分,我們最近重新審視了 JetStream2 基準測試套件,以消除性能瓶頸。本篇文章詳細介紹了一項具體的優化,它使 async-fs
基準測試達到了顯著的 2.5倍
性能提升,並對整體得分帶來了可觀的增益。該優化受基準測試的啟發,但類似模式也出現在真實世界代碼中。
JavaScript Promise Integration (JSPI) API 允許使用假設 同步 訪問外部功能編寫的 WebAssembly 應用程式在實際功能 非同步 的環境中順暢運行。
WebAssembly 的 JavaScript Promise Integration (JSPI) API 引入了全新的 API,適用於 Chrome M126 版本。我們將討論這些變更內容、如何配合 Emscripten 使用,以及 JSPI 的發展路線圖。
JSPI 是一個 API,允許使用同步 API 的 WebAssembly 應用程式訪問 非同步 的 Web API。許多 Web API 是基於 JavaScript Promise
對象設計的:它們不會立即執行請求的操作,而是返回一個 Promise
以執行操作。另一方面,許多編譯為 WebAssembly 的應用程式來自 C/C++ 界,這些程式通常使用會阻塞調用者直到完成的 API。
距離最初的設計文檔發佈已過去了將近三年,在這期間進行了數百次代碼更改,V8 沙箱——一個用於 V8 的輕量級、進程內沙箱——現已發展到不再被視為實驗性安全功能的地步。從今天開始,V8 沙箱被納入 Chrome 的脆弱性獎勵計劃 (VRP)。雖然仍有一些問題需要解決,才能成為強有力的安全邊界,但納入 VRP 是向該方向邁出的重要一步。因此,Chrome 123 可被視為沙箱的某種「Beta」版本。這篇博客利用這個機會討論了沙箱背後的動機,展示了它如何防止 V8 的記憶體損壞在宿主進程中蔓延,並最終解釋了為什麼這是邁向記憶體安全的必要步驟。
WebAssembly 的 JavaScript Promise Integration (JSPI) API 即將隨 Chrome M123 版本進入來源試驗。這意味著您可以測試您和您的用戶是否能從此新的 API 中受益。
JSPI 是一個 API,允許編譯成 WebAssembly 的所謂序列代碼訪問 非同步 的 Web API。許多 Web API 是以 JavaScript Promise
為基礎設計的:它們並未立即執行請求的操作,而是返回一個 Promise
來完成操作。當操作最終完成時,瀏覽器的任務執行器會使用 Promise 調用任何回調。JSPI 透過鉤入這種架構來允許 WebAssembly 應用程式在返回 Promise
時暫停,並在 Promise
被解析後恢復。
你是否曾經好奇像 undefined
、true
等核心 JavaScript 物件是從哪裡來的?這些物件是任何使用者定義物件的基本單位,必須先存在。V8 將它們稱為不可移動且不可變的根物件,並將它們存放於自己的堆區——唯讀堆。由於這些物件被頻繁使用,因此快速存取至關重要。而什麼能比在編譯時正確推測它們的記憶體位址更快呢?
歡迎來到令人興奮的 V8 世界,在這裡速度不僅僅是一項功能,而是一種生活方式。當我們向 2023 年告別時,是時候慶祝 V8 今年取得的令人印象深刻的成就了。
通過創新的性能優化,V8 繼續在不斷演變的 Web 領域推進可能性的邊界。我們引入了一個新的中層編譯器,並對頂層編譯器基礎設施、運行時和垃圾回收器進行了多項改進,這些改進帶來了全方位的顯著速度提升。
在 Chrome M117 中,我們引入了一個新的優化編譯器:Maglev。Maglev 位於現有的 Sparkplug 和 TurboFan 編譯器之間,扮演快速生成足夠好的代碼的快速優化編譯器角色。
直到 2021 年,V8 主要有兩個執行層級:Ignition(解釋器);以及 TurboFan,V8 的優化編譯器,專注於峰值效能。所有 JavaScript 代碼首先編譯為 Ignition bytecode,並通過解釋來執行。在執行期間,V8 追蹤程式的行為,包括追蹤物件形狀和類型。執行時的元數據及 bytecode 都會被輸入到優化編譯器中,以生成高效能(通常是投機性的)機器代碼,可以顯著快於解釋器執行。