跳至主要内容

38 篇文章 含有標籤「internals」

檢視所有標籤

更輕量的 V8

· 閱讀時間約 11 分鐘
Mythri Alle、Dan Elphick 以及 [Ross McIlroy](https://twitter.com/rossmcilroy),V8 減重專家

2018 年底,我們啟動了一個名為 V8 Lite 的專案,目的是顯著減少 V8 的記憶體使用量。起初,這項專案被構想為 V8 的一個獨立 輕量模式,專門針對低記憶體的行動裝置或注重記憶體使用而非執行速度的嵌入式案例。然而,在此期間,我們意識到許多為這個 輕量模式 開發的記憶體優化技術可以應用到常規的 V8,從而讓所有 V8 的使用者受益。

在 React 中 V8 性能崖的故事

· 閱讀時間約 17 分鐘
Benedikt Meurer ([@bmeurer](https://twitter.com/bmeurer)) 和 Mathias Bynens ([@mathias](https://twitter.com/mathias))

之前,我們討論了 JavaScript 引擎如何通過使用形狀和內線快取來優化物件和數組訪問,並探索了引擎如何加速原型屬性訪問。本文敘述 V8 如何為各種 JavaScript 值選擇最佳的內存表示方式,以及這如何影響形狀機制——這有助於解釋React 核心中最近的 V8 性能崖

2019年JavaScript的成本

· 閱讀時間約 14 分鐘
Addy Osmani([@addyosmani](https://twitter.com/addyosmani)),JavaScript清道夫,與Mathias Bynens([@mathias](https://twitter.com/mathias)),主線程解放者
備註

注意: 如果你比較喜歡觀看演講而非閱讀文章,請欣賞以下影片!如果不是,跳過影片繼續閱讀。

“JavaScript的成本” 由Addy Osmani在2019年的#PerfMatters大會中演講。

WebAssembly 開發人員的程式碼快取

· 閱讀時間約 10 分鐘
[比爾·巴奇 (Bill Budge)](https://twitter.com/billb),在快取中放入 Ca-ching!

有句開發人員中的諺語叫做:最快的程式碼是不需要執行的程式碼。同樣,最快編譯的程式碼是不需要編譯的程式碼。WebAssembly 程式碼快取是 Chrome 和 V8 中的一項新優化,試圖通過快取編譯器生成的原生程式碼來避免程式碼編譯。我們之前曾寫過 探討過 如何 總結 Chrome 和 V8 快取 JavaScript 程式碼的方式,以及如何利用這項優化的最佳實踐。在本文中,我們將描述 Chrome 的 WebAssembly 程式碼快取的運作方式,以及開發人員如何利用它來加速大型 WebAssembly 模組的應用程式載入。

極速解析,第2部分:延遲解析

· 閱讀時間約 15 分鐘
Toon Verwaest([@tverwaes](https://twitter.com/tverwaes))和 Marja Hölttä([@marjakh](https://twitter.com/marjakh)),解析器專家

這是我們系列文章的第二部分,解釋了V8如何以最快速度解析JavaScript。第一部分解釋了我們如何讓V8的掃描器更快。

解析是把源代碼轉換為可供編譯器使用的中間表示的步驟(在V8中,是字節碼編譯器Ignition)。解析和編譯發生在網頁啟動的關鍵路徑上,而並不是所有的函數都在啟動期間立即需要。即使開發者可以用異步和延遲腳本來推遲這些代碼的執行,但這並非總是可行。此外,許多網頁會傳輸一些僅被某些功能使用的代碼,而這些功能可能在單個頁面加載過程中完全未被用戶訪問。

JavaScript 開發者的程式碼快取

· 閱讀時間約 15 分鐘
[Leszek Swirski](https://twitter.com/leszekswirski),快取擊碎者

程式碼快取(也稱為 位元碼快取)是瀏覽器中的一項重要優化。它透過快取解析及編譯的結果,減少常訪網站的啟動時間。大多數 流行瀏覽器 都實現了某種形式的程式碼快取,Chrome 也不例外。事實上,我們曾經 撰文 並且 談論 過 Chrome 和 V8 如何快取已編譯的程式碼。

極速解析,第1部分:優化掃描器

· 閱讀時間約 11 分鐘
Toon Verwaest ([@tverwaes](https://twitter.com/tverwaes)),令人震驚的優化者

要運行一個JavaScript程序,需要對源代碼文本進行處理,以便V8能夠理解它。V8首先將源代碼解析為抽象語法樹(AST),這是一組表示程序結構的物件。該AST由Ignition編譯為位元碼。這些解析和編譯階段的性能非常重要:V8在編譯完成之前無法運行代碼。在這一系列的博客文章中,我們將重點關注解析以及V8為提供極速解析器所做的工作。

無 JIT 的 V8

· 閱讀時間約 4 分鐘
Jakob Gruber ([@schuay](https://twitter.com/schuay))

V8 v7.4 現已支援在執行期間不分配可執行記憶體的 JavaScript 執行功能。

在其預設配置中,V8 大量依賴於在執行期間分配和修改可執行記憶體的能力。例如,TurboFan 優化編譯器會針對熱 JavaScript 函式即時生成原生代碼,而多數 JavaScript 正則表達式則由 irregexp 引擎編譯成原生代碼。在執行期間創建可執行記憶體是 V8 快速的部分原因。

嵌入式內建函數

· 閱讀時間約 11 分鐘
Jakob Gruber ([@schuay](https://twitter.com/schuay))

V8 的內建函數 (builtins) 在每個 V8 實例中消耗記憶體。內建函數的數量、平均大小以及每個 Chrome 瀏覽器分頁的 V8 實例數量顯著增加。本文介紹了我們如何在過去一年內將每個網站的V8堆積大小中位數減少了19%。

V8中的並行標記

· 閱讀時間約 13 分鐘
Ulan Degenbaev、Michael Lippautz 和 Hannes Payer — 主執行緒解放者

本文介紹了一種稱為_並行標記_的垃圾回收技術。此優化使 JavaScript 應用程式能在垃圾回收器掃描堆進行標記存活物件時繼續執行。基準測試顯示,並行標記可將主執行緒上的標記時間減少60%–70%。並行標記是Orinoco專案的最後一塊拼圖——該專案旨在逐步將舊的垃圾回收器替換為新的大部分並行和平行垃圾回收器。並行標記在 Chrome 64 和 Node.js v10中為預設啟用。