極速解析,第1部分:優化掃描器
要運行一個JavaScript程序,需要對源代碼文本進行處理,以便V8能夠理解它。V8首先將源代碼解析為抽象語法樹(AST),這是一組表示程序結構的物件。該AST由Ignition編譯為位元碼。這些解析和編譯階段的性能非常重要:V8在編譯完成之前無法運行代碼。在這一系列的博客文章中,我們將重點關注解析以及V8為提供極速解析器所做的工作。
要運行一個JavaScript程序,需要對源代碼文本進行處理,以便V8能夠理解它。V8首先將源代碼解析為抽象語法樹(AST),這是一組表示程序結構的物件。該AST由Ignition編譯為位元碼。這些解析和編譯階段的性能非常重要:V8在編譯完成之前無法運行代碼。在這一系列的博客文章中,我們將重點關注解析以及V8為提供極速解析器所做的工作。
V8 v7.4 現已支援在執行期間不分配可執行記憶體的 JavaScript 執行功能。
在其預設配置中,V8 大量依賴於在執行期間分配和修改可執行記憶體的能力。例如,TurboFan 優化編譯器會針對熱 JavaScript 函式即時生成原生代碼,而多數 JavaScript 正則表達式則由 irregexp 引擎編譯成原生代碼。在執行期間創建可執行記憶體是 V8 快速的部分原因。
在過去幾年中,V8 的垃圾回收器(GC)發生了很大的變化。奧里諾科項目將一個順序性的全程停頓垃圾回收器轉變為一個主要併行並發且具有增量回退功能的回收器。
在他於 V8 團隊的三個月實習期間,Hai Dang 專注於提升 [...array]
、[...string]
、[...set]
、[...map.keys()]
和 [...map.values()]
的性能(當擴展元素位於數組字面量的開頭時)。他甚至還大幅提升了 Array.from(iterable)
的性能。本文解釋了他改進的部分詳細內容,這些更改從 V8 v7.2 開始被引入。
JavaScript 中的非同步處理傳統上被認為速度並不特別快。更糟的是,對即時運行的 JavaScript 應用進行除錯——尤其是 Node.js 伺服器——並不容易,_特別是_涉及非同步程式時。不過幸運的是,時代正在改變。本文將探討我們如何在 V8(以及某種程度上其他 JavaScript 引擎)中優化非同步函式與 Promise,並描述我們如何改進非同步程式碼的除錯體驗。