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.

後語

先將結論放出來:

JavaScript 為什麼快?

V8的執行管道架構圖

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的使用場景。

JavaScript 為什麼快?

V8的衡量模型

  • 場景一:
foo(42);

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

JavaScript 為什麼快?

場景一

  • 場景二:
for (var i=0; i<10000>

執行一萬次foo函數;在 PC瀏覽器/Node.js 服務器中,期望高性能運行foo函數;

JavaScript 為什麼快?

執行一萬次foo函數;在 手機瀏覽器/Node.js IoT 設備中,期望低內存,較高性能運行foo函數;

JavaScript 為什麼快?

V8 的執行管道

V8 到底怎麼做到在快速啟動/性能巔峰,低內存/高優化內存的各個檔位之前任意切換的呢?

JavaScript 為什麼快?

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 在快速啟動/性能巔峰,低內存/高優化內存;各個檔位之前任意切換。


分享到:


相關文章: