為啥升級了 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 語法解析階段:
- JS 的語法解析速度: 大約1MB/s;400k的JS代碼,語法解析就需要~370ms
- 可以通過 chrome://tracing,檢查你代碼的語法解析時間 (function eager(){...})();
- 運行的代碼儘量少:-)
V8編譯階段:
- 儘量寫「靜態類型」的代碼
- WebAssembly 使用了 TurboFan
V8 JS編碼:
- Async/Await 比 Generators 快幾乎1.5倍
- ES2015 的速度越來越接近 ES5
V8 for Node.js:
- 異步調試代碼: node --inspect app.js
- 瀏覽器: chrome://inspect
V8 for browser:
- Coverage功能,檢查運行代碼的覆蓋率
V8的衡量標準
作為 JS 引擎,不光要考慮性能攀升,還需要考慮啟動速度,內存使用率。V8 的產品經理給出了他們衡量V8 引擎的模型和V8的使用場景。
- 場景一:
foo(42);
執行只有一個函數;期望快速啟動語法分析並且編譯運行;
- 場景二:
for (var i=0; i<10000>執行一萬次foo函數;在 PC瀏覽器/Node.js 服務器中,期望高性能運行foo函數;
執行一萬次foo函數;在 手機瀏覽器/Node.js IoT 設備中,期望低內存,較高性能運行foo函數;
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 在快速啟動/性能巔峰,低內存/高優化內存;各個檔位之前任意切換。
關鍵字: Node.js 瀏覽器 JavaScript