為啥升級了 Node。js 版本,速度會提升?

為啥 Node。js 程式碼啟動時那麼慢,執行起來了會變快?

V8 JIT 是啥?

前言

V8 的產品定義:Speed up real-world performance for modern JavaScript, and enable developers to build a faster future web。

最近看了 V8 核心小組3個影片,感覺很有價值,做一次搬運工(英語好的同學可以自行觀賞),我計劃將3個影片分為3篇文章:

第一篇來源,V8小組的產品經理;V8, Advanced JavaScript, & the Next Performance Frontier (Google I/O ‘17)

第二篇來源,V8的語法解析;Parsing JavaScript - better lazy than eager?

第三篇來源,V8的編譯執行;How JavaScript Engines Work

後語

先將結論放出來:

JavaScript 為什麼快——第一篇?

V8的執行管道架構圖

1。 V8 語法解析階段:

JS 的語法解析速度: 大約1MB/s;400k的JS程式碼,語法解析就需要

~370ms

可以透過

chrome://tracing

,檢查你程式碼的語法解析時間

(function eager(){。。。})();

執行的程式碼儘量少:-)

2。 V8編譯階段:

儘量寫「靜態型別」的程式碼

WebAssembly 使用了 TurboFan

3。 V8 JS編碼:

Async/Await 比 Generators 快幾乎1。5倍

ES2015 的速度越來越接近 ES5

4。 V8 for Node。js:

非同步除錯程式碼:

node ——inspect app。js

瀏覽器:

chrome://inspect

5。 V8 for browser:

Coverage功能,檢查執行程式碼的覆蓋率

第一篇:why V8? -

V8產品經理的描述

作為第一篇,我們先看看 V8 的產品經理是怎麼看待 V8 引擎的。

全域性介紹 V8 的程式碼執行管道的架構。

V8的衡量標準

作為 JS 引擎,不光要考慮效能攀升,還需要考慮啟動速度,記憶體使用率。V8 的產品經理給出了他們衡量V8 引擎的模型和V8的使用場景。

JavaScript 為什麼快——第一篇?

V8的衡量模型

場景一:

foo(42);

執行只有一個函式;期望快速啟動語法分析並且編譯執行;

JavaScript 為什麼快——第一篇?

場景一

場景二:

for (var i=0; i<10000; i++) {

foo(i);

}

執行一萬次foo函式;在 PC瀏覽器/Node。js 伺服器中,期望高效能執行foo函式;

JavaScript 為什麼快——第一篇?

場景二。1

執行一萬次foo函式;在 手機瀏覽器/Node。js IoT 裝置中,期望低記憶體,較高效能執行foo函式;

JavaScript 為什麼快——第一篇?

場景二。2

V8 的執行管道

V8 到底怎麼做到在快速啟動/效能巔峰,低記憶體/高最佳化記憶體的各個檔位之前任意切換的呢?

JavaScript 為什麼快——第一篇?

V8的執行管道架構圖

TurboFan (渦輪增壓)

V8 的最佳化編譯器,積累了3年以上

用於提升程式碼效能

支援並最佳化 ES2015+ 特性

WebAssembly 的後臺

Ignition (點火器)

佔用少量記憶體,快速啟動

原先設計用於低記憶體的裝置,現在用於所有平臺節省記憶體;

快速生成二進位制程式碼,提升頁面啟動速度;

結合 TurboFan 使快速啟動和效能最佳化更簡單;

Ignition + TurboFan

2017年全新的 JavaScript pipeline

JS 程式碼更快

更少記憶體

更全新的效能提升

更適合 Node。js

不再拖欠 JS 新增功能

重寫內建函式(高達4倍提速)

Orinoco (V8 GC)

幾乎並行併發的壓縮演算法 GC

並行壓縮,並行指標更新,避免新舊生代頻繁更新提升頁面速度,併發交換(sweep)

馬上支援:併發標記

Speedometer2 (V8 in-browser benchmarks)

V8 用於的更適合測試瀏覽器 JS 的 benchmarks

測試流行 MVC 框架的最新版本 TodoList

幾乎(謙虛)是最好的瀏覽器 benchmarks

最佳化 ES2015

Generators 提升2。5倍速度

Async/Await 提升4。5倍速度

Promise 提升4倍速度

V8 love Node.js

V8 是 Node。js 委員會的核心成員,持續提升最佳化 Node。js 的效能

AcmeAir benchmark

Node。js 的 benchmark

Node.js + DevTools

更容易除錯 Node。js 的程式碼

啟動時加

——inspect

引數

node ——inspect index。js

透過chrome位址列的

about:inspect

連結除錯 node 程式碼

支援非同步除錯,profiling 和更多功能

Code Coverage 功能

檢視哪些程式碼沒有被執行

WebAssembly

安全跨瀏覽器的原生程式碼

Chrome 和 FireFox 支援,未來包括:Edge 和 Safari

透過 Emscripten toolchain 編譯 C/C++ 到 web

未來計劃:更好的效能;更容易從 Response object 例項化;支援共享 ArrayBuffers(Chrome 60)

小結

JavaScript 的執行效能,依賴環境和上下文。

Ignition+TurboFan+Webassambly,可以讓 V8 在快速啟動/效能巔峰,低記憶體/高最佳化記憶體;各個檔位之前任意切換。

JavaScript 為什麼快——第一篇?

引擎+換擋