javascript发展怎么样(JavaScript为什么快一)
javascript发展怎么样(JavaScript为什么快一)3. V8 JS编码:2. V8编译阶段:先将结论放出来:V8的执行管道架构图1. V8 语法解析阶段:
前言
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 在快速启动/性能巅峰,低内存/高优化内存;各个档位之前任意切换。
引擎 换挡