NodeJS
首发于NodeJS
JavaScript 为什么快——第一篇?

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的执行管道架构图

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

引擎+换挡

编辑于 2018-08-02

文章被以下专栏收录

    在 eggjs 团队的日常协作中,遵循「基于 GitLab 的硬盘式异步协作模式」。 先通过 issue 发起 RFC 召集讨论,再提交 Pull Request 和 Code Review,这样便于沉淀,即使是当时没有参与讨论的开发者,事后也能通过 issue 了解某个功能设计的前因后果。 因此,本专栏用于汇总近期值得关注的 Egg.js 和 Node.js 相关动态,将不定期发布。

    阿里妈妈 MUX 倾力打造,每周更新一篇周刊以及不定时的发表原创文章(投稿请先私信 @一丝)