JavaScript 為什麼快——第一篇?
為啥升級了 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
後語
先將結論放出來:
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的使用場景。
V8的衡量模型
場景一:
foo(42);
執行只有一個函式;期望快速啟動語法分析並且編譯執行;
場景一
場景二:
for (var i=0; i<10000; i++) {
foo(i);
}
執行一萬次foo函式;在 PC瀏覽器/Node。js 伺服器中,期望高效能執行foo函式;
場景二。1
執行一萬次foo函式;在 手機瀏覽器/Node。js IoT 裝置中,期望低記憶體,較高效能執行foo函式;
場景二。2
V8 的執行管道
V8 到底怎麼做到在快速啟動/效能巔峰,低記憶體/高最佳化記憶體的各個檔位之前任意切換的呢?
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 在快速啟動/效能巔峰,低記憶體/高最佳化記憶體;各個檔位之前任意切換。
引擎+換擋