透过 V8 引擎看 ES2015 语法 async\/await 的本质
来源:互联网 发布:手机淘宝首页如何装修 编辑:程序博客网 时间:2024/05/23 00:04
这几天 javascript 最火的新闻莫过于 koa2 发布了正式版。目前最新版本是v2.0.1,koa2 团队宣称 “只要 nodejs 还未支持 async,koa2 就一直不发布正式版”,随着 node v7.6.0 的到来,全栈工程师们期待已久的 koa2 也终于正式版了——完美支持 async 函数,优雅的解决异步回调。
这一切的功劳还要归功于 V8 引擎。知乎上关于 async 的问题又重新出现在了 timeline 上:《ES next 中 async/await proposal 实现原理是什么?》。我看到很多人在回答 async 本质是 promise、yield、generator,于是也凑热闹回答了一下,等晚上再看的时候,顿时有一种穿越感:
很早之前 V8 就已经更换了新的优化执行引擎:TurboFan,不仅仅可以优化 try/catch/finally、for...of 等之前 Crankshaft 不能优化的语法,还支持了更多的 ES2015+ features。
TurboFan 引擎不仅仅是增加了对 async 的支持,更增加了对 async、generators 优化的支持。下面是生成的二进制码和 TurboFan 执行图:
在此之前很多需要借助 babel 编译的 ES2015 新特性都得到了原生支持。
异步函数:
async function* readLines(path) {
let file = await fileOpen(path);
try {
while (!file.EOF) {
yield await file.readLine();
}
} finally {
await file.close();
}
}
上面的 187 个字符会被 babel 编译成 2987 个字符,代码大小增加了 650%。文件地址:https://gist.github.com/justjavac/cdfe4cc0a55744e093250b8aca6a325a
对于数组和对象的析构赋值(array destructuring)
function fn() {
var [c] = data;
return c;
}
bable 编译成:
"use strict";
var _slicedToArray = function () {...(此处省略630个字符)
function fn() {
var _data = data,
_data2 = _slicedToArray(_data, 1),
c = _data2[0];
return c;
}
查看完整代码会发现里面有 Crankshaft 无法优化的 try/catch/finally。而在最新 V8 里面,析构赋值几乎和数组元素直接赋值一样快:
function fn() {
var c = data[0];
return c;
}
其它的 ES2015+ 特性也有大幅度优化:
关注最新的 V8 引擎进展可以看看 V8 的 《ES2015 and beyond performance plan(需科学上网)》。
参考文章:
High-performance ES2015 and beyond
Async Iterators for JavaScript
V8’s new interpreter and compiler pipeline
ES2015 and beyond performance plan
最后是广告时间,欢迎加入我的圈子:
- 透过 V8 引擎看 ES2015 语法 async\/await 的本质
- Async Programming - 1 async-await 糖的本质(1)
- 透过现象看本质 - 壮志未酬的BPEL
- 透过现象看本质。。。
- 透过表象看本质!?
- 透过表象看本质!?
- 透过现象看本质
- async,await本质以及与Task的关系。
- ES7的Async/Await
- ES7的Async/Await
- ES7的Async/Await
- 透过现象看本质(一)
- 透过JVM看Exception本质
- 从ORA-01752的错误,透过现象看本质
- 关于U3d 使用 async await异步语法
- 使nodejs服务端支持async/await语法
- Unity3D async await异步语法用法
- WP8的async和await
- Codeforces Round #436 (Div. 2)Bus
- ES6 中的 this & super:babel 和 typescript 都错了
- 每个前端程序员都有一个V8梦(附福利)
- 使用 Node.js\/D8 分析 javascript 如何被 V8 引擎优化的
- 如何优雅的处理 Promise 的 if-else 分支
- 透过 V8 引擎看 ES2015 语法 async\/await 的本质
- 知识付费时代来临,欢迎一起交流分享
- [V8内核系列] 开启对象属性的“fast”模式
- 从 V8 的单元测试源码看“同值相等”
- V8 使用“常量折叠”优化技巧,导致幂(**)运算有时候不等于 Math.pow()
- JavaScript 函数式编程的性能问题
- 昨天收到PHPHub创始人Summer的道歉,已经线下和解
- 用 Chrome 开发者工具分析 javascript 的内存回收(GC)
- javascript 之谜系列:为什么 [1,2] + [3,4] 不等于 [1,2,3,4]?