啟動 Ignition 解釋器
V8 和其他現代 JavaScript 引擎通過即時編譯 (JIT)將腳本快速編譯成原生機器碼然後立即執行來獲得速度。程式碼最初由基準編譯器快速生成非最佳化的機器碼進行編譯。在執行期間,編譯後的碼會被分析並且可選擇使用更高級的最佳化編譯器重新編譯以達到最佳效能。在 V8 中,此腳本執行流程涉及多種特殊情況和條件,需用複雜的機制在基準編譯器與兩個最佳化編譯器 Crankshaft 和 TurboFan 之間切換。
V8 和其他現代 JavaScript 引擎通過即時編譯 (JIT)將腳本快速編譯成原生機器碼然後立即執行來獲得速度。程式碼最初由基準編譯器快速生成非最佳化的機器碼進行編譯。在執行期間,編譯後的碼會被分析並且可選擇使用更高級的最佳化編譯器重新編譯以達到最佳效能。在 V8 中,此腳本執行流程涉及多種特殊情況和條件,需用複雜的機制在基準編譯器與兩個最佳化編譯器 Crankshaft 和 TurboFan 之間切換。
在之前的博客文章中,我們介紹了垃圾回收中斷流暢瀏覽體驗所導致的卡頓問題。在這篇文章中,我們介紹了三項優化,它們為 V8 中一個新的垃圾回收器代號為 Orinoco 奠定了基礎。Orinoco 基於這樣一個理念:實現一個大多數並行且併發的垃圾回收器,且不依賴嚴格的代界限,將減少垃圾回收卡頓和內存消耗,同時提供高吞吐量。我們選擇不僅僅作為一個獨立的垃圾回收器來實施 Orinoco,而是分階段在 V8 的樹頂逐步提供 Orinoco 的功能,以便立即為用戶提供益處。本篇文章探討的三個功能是並行壓縮、並行記憶集合處理,以及黑色分配。
V8 用 JavaScript 自身實現了 JavaScript 語言內建物件和函數的一個大子集。例如,您可以看到我們的 Promise 實現 是用 JavaScript 編寫的。這樣的內建物件被稱為 自托管。這些實現被包含在我們的 啟動快照 中,以便可以快速創建新上下文,而不需要在運行時設置和初始化自托管的內建物件。
Math.random()
返回一個帶正號、且大於等於0
且小於1
的Number
值,這個值是隨機選出的或是伪隨機選出的,並且在該範圍內近似於均勻分佈,使用實現依賴的算法或策略。此函數不接受任何參數。
JavaScript 規範包括許多內建功能,從數學函數到一個功能完善的正則表達式引擎。每個新創建的 V8 context 從一開始就可以使用這些功能。為了達到這一點,必須在 context 被創建時,將全域物件(例如,在瀏覽器中的 window 物件)和所有內建功能設置並初始化到 V8 的 heap 中。從零開始完成這些操作需要相當多的時間。
JavaScript 的效能始終是 Chrome 價值的關鍵,尤其是在提供流暢的體驗方面。從 Chrome 41 開始,V8 採用了一種新技術通過在閒置時間的小型未使用片段中隱藏昂貴的內存管理操作來提升 Web 應用的響應速度。結果,Web 開發者可期待更順暢的滾動和流暢的動畫,垃圾回收引起的卡頓大幅減少。
上週我們宣布我們已經為某些類型的JavaScript啟用了TurboFan。在這篇文章中,我們希望深入探討TurboFan的設計。