V8 性能再升級(jí),支持更多 ES2015 語法優(yōu)化

這幾天 javascript 最火的新聞莫過于 koa2 發(fā)布了正式版。目前最新版本是v2.0.1,koa2 團(tuán)隊(duì)宣稱 “只要 nodejs 還未支持 async,koa2 就一直不發(fā)布正式版”,隨著 node v7.6.0 的到來,全棧工程師們期待已久的 koa2 也終于正式版了——完美支持 async 函數(shù),優(yōu)雅的解決異步回調(diào)。

這一切的功勞還要?dú)w功于 V8 引擎。知乎上關(guān)于 async 的問題又重新出現(xiàn)在了 timeline 上:ES next中async/await proposal實(shí)現(xiàn)原理是什么?我看到很多人在回答 async 本職是 promise、yield、generator,于是也湊熱鬧回答了一下,等晚上再看的時(shí)候,頓時(shí)有一種穿越感:

很早之前 V8 就已經(jīng)更換了新的優(yōu)化執(zhí)行引擎:TurboFan,不僅僅可以優(yōu)化 try/catch/finally、for...of 等之前 Crankshaft 不能優(yōu)化的語法,還支持了更多的 ES2015+ features。

TurboFan 引擎不僅僅是增加了對(duì) async 的支持,更增加了對(duì) async、generators 優(yōu)化的支持。下面是生成的二進(jìn)制碼和 TurboFan 執(zhí)行圖:

在此之前很多需要借助 babel 編譯的 ES2015 新特性都得到了原生支持。

異步函數(shù):

async function* readLines(path) {
  let file = await fileOpen(path);
  try {
    while (!file.EOF) {
      yield await file.readLine();
    }
  } finally {
    await file.close();
  }
}

上面的 187 個(gè)字符會(huì)被 babel 編譯成 2987 個(gè)字符,代碼大小增加了 650%。文件地址:https://gist.github.com/justjavac/cdfe4cc0a55744e093250b8aca6a325a

對(duì)于數(shù)組和對(duì)象的析構(gòu)賦值(array destructuring)

function fn() {
  var [c] = data;
  return c;
}

bable 編譯成:

"use strict";

var _slicedToArray = function () {...(此處省略630個(gè)字符)

function fn() {
  var _data = data,
      _data2 = _slicedToArray(_data, 1),
      c = _data2[0];
  return c;
}

查看完整代碼會(huì)發(fā)現(xiàn)里面有 Crankshaft 無法優(yōu)化的 try/catch/finally。而在最新 V8 里面,析構(gòu)賦值幾乎和數(shù)組元素直接賦值一樣快:

function fn() {
  var c = data[0];
  return c;
}

其它的 ES2015+ 特性也有大幅度優(yōu)化:

關(guān)注最新的 V8 引擎進(jìn)展可以看看 V8 的 《ES2015 and beyond performance plan(需科學(xué)上網(wǎng))》。

參考文章:

最后是廣告時(shí)間,歡迎訂閱我的公眾號(hào):

perfcomparison.png
justjavac V8
justjavac V8
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容