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 在快速启动/性能巅峰,低内存/高优化内存;各个档位之前任意切换。


分享到:


相關文章: