跳至主要内容

38 篇文章 含有標籤「internals」

檢視所有標籤

啟動 Ignition 解釋器

· 閱讀時間約 4 分鐘
Ross McIlroy, V8 Ignition 啟動器

V8 和其他現代 JavaScript 引擎通過即時編譯 (JIT)將腳本快速編譯成原生機器碼然後立即執行來獲得速度。程式碼最初由基準編譯器快速生成非最佳化的機器碼進行編譯。在執行期間,編譯後的碼會被分析並且可選擇使用更高級的最佳化編譯器重新編譯以達到最佳效能。在 V8 中,此腳本執行流程涉及多種特殊情況和條件,需用複雜的機制在基準編譯器與兩個最佳化編譯器 Crankshaft 和 TurboFan 之間切換。

垃圾怪客破壞者第二部:Orinoco

· 閱讀時間約 6 分鐘
垃圾怪客破壞者:烏蘭·德根巴耶夫,邁克爾·利帕烏茨,以及哈內斯·佩耶爾

之前的博客文章中,我們介紹了垃圾回收中斷流暢瀏覽體驗所導致的卡頓問題。在這篇文章中,我們介紹了三項優化,它們為 V8 中一個新的垃圾回收器代號為 Orinoco 奠定了基礎。Orinoco 基於這樣一個理念:實現一個大多數並行且併發的垃圾回收器,且不依賴嚴格的代界限,將減少垃圾回收卡頓和內存消耗,同時提供高吞吐量。我們選擇不僅僅作為一個獨立的垃圾回收器來實施 Orinoco,而是分階段在 V8 的樹頂逐步提供 Orinoco 的功能,以便立即為用戶提供益處。本篇文章探討的三個功能是並行壓縮、並行記憶集合處理,以及黑色分配。

V8 附加功能

· 閱讀時間約 6 分鐘
Domenic Denicola ([@domenic](https://twitter.com/domenic)), Streams 魔法師

V8 用 JavaScript 自身實現了 JavaScript 語言內建物件和函數的一個大子集。例如,您可以看到我們的 Promise 實現 是用 JavaScript 編寫的。這樣的內建物件被稱為 自托管。這些實現被包含在我們的 啟動快照 中,以便可以快速創建新上下文,而不需要在運行時設置和初始化自托管的內建物件。

有 `Math.random()`,然後有 `Math.random()`

· 閱讀時間約 4 分鐘
楊國 ([@hashseed](https://twitter.com/hashseed)),軟體工程師兼骰子設計師

Math.random() 返回一個帶正號、且大於等於 0 且小於 1Number 值,這個值是隨機選出的或是伪隨機選出的,並且在該範圍內近似於均勻分佈,使用實現依賴的算法或策略。此函數不接受任何參數。

自訂啟動快照

· 閱讀時間約 3 分鐘
Yang Guo ([@hashseed](https://twitter.com/hashseed)), 軟體工程師和引擎預熱供應商

JavaScript 規範包括許多內建功能,從數學函數到一個功能完善的正則表達式引擎。每個新創建的 V8 context 從一開始就可以使用這些功能。為了達到這一點,必須在 context 被創建時,將全域物件(例如,在瀏覽器中的 window 物件)和所有內建功能設置並初始化到 V8 的 heap 中。從零開始完成這些操作需要相當多的時間。

免費獲得垃圾回收

· 閱讀時間約 8 分鐘
Hannes Payer 和 Ross McIlroy,閒置垃圾回收器

JavaScript 的效能始終是 Chrome 價值的關鍵,尤其是在提供流暢的體驗方面。從 Chrome 41 開始,V8 採用了一種新技術通過在閒置時間的小型未使用片段中隱藏昂貴的內存管理操作來提升 Web 應用的響應速度。結果,Web 開發者可期待更順暢的滾動和流暢的動畫,垃圾回收引起的卡頓大幅減少。

程式碼緩存

· 閱讀時間約 2 分鐘
Yang Guo ([@hashseed](https://twitter.com/hashseed)), 軟體工程師

V8 使用 即時編譯(JIT)來執行 JavaScript 程式碼。這表示在執行腳本之前,必須先對其進行解析和編譯,這可能會導致相當大的額外開銷。正如我們最近公告提到的,程式碼緩存是一種減少這種開銷的技術。當腳本第一次被編譯時,會生成緩存數據並將其儲存。下一次 V8 需要編譯相同的腳本時,即使在不同的 V8 實例中,也可以使用緩存數據來重建編譯結果,而不是從頭編譯。因此,腳本能夠更快地執行。