前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >V8 9.0 版本都有哪些新东西?

V8 9.0 版本都有哪些新东西?

作者头像
ConardLi
发布2021-04-07 15:19:51
9820
发布2021-04-07 15:19:51
举报
文章被收录于专栏:code秘密花园code秘密花园

V8 9.0 版本已经来到了测试阶段,将在数周内和 Chrome 90 Stable 一起发布,下面我们就先来预览一下这个版本中的一些亮点。

正则匹配索引

v9.0 开始,开发人员可以获取正则表达式匹配中匹配的捕获组的开始和结束位置的数组。当正则表达式带有 /d 标志时,这个数组可以通过匹配对象上的 .indices 属性获得。

代码语言:javascript
复制
const re = /(a)(b)/d;        // Note the /d flag.
const m = re.exec('ab');
console.log(m.indices[0]); // Index 0 is the whole match.
// → [0, 2]
console.log(m.indices[1]); // Index 1 is the 1st capture group.
// → [0, 1]
console.log(m.indices[2]); // Index 2 is the 2nd capture group.
// → [1, 2]

可以访问 https://v8.dev/features/regexp-match-indices 了解更多介绍。

更快的 super 属性访问

通过使用 V8 的内联缓存系统和 TurboFan 中优化的代码生成,对 super 属性(例如 super.x )的访问进行了优化。通过这些更改, super 属性访问的性能将接近于常规属性访问,如下图所示。

禁用 for ( async of 写法

这是一个被广泛讨论的语法分歧,Chrome 90 / V8 9.0 将明确禁止使用 for ( async of ,语法也不会再支持解析。

更快的 JS-to-Wasm 调用

V8WebAssemblyJavaScript 函数的参数使用了不同的表示方式。因此,当JavaScript 调用一个 WebAssembly 函数时,这个调用会经过一个所谓的 JS-to-Wasm 包装器,负责将参数从 JavaScript 域调整到 WebAssembly 域,并从相反的方向调整结果。

不幸的是,这样的操作性能损耗很大,所以 JavaScriptWebAssembly 的调用不如 JavaScriptJavaScript 的调用快。为了最大程度地减少这种性能开销,JS-to-Wasm 包装器现在可以内联到调用站点,从而简化代码并删除多余的框架。

假设我们有一个 WebAssembly 函数:

代码语言:javascript
复制
double addNumbers(double x, double y) {
  return x + y;
}

假设我们从 JavaScript 调用它来添加一些向量(表示为类型数组):

代码语言:javascript
复制
const addNumbers = instance.exports.addNumbers;

function vectorSum(len, v1, v2) {
  const result = new Float64Array(len);
  for (let i = 0; i < len; i++) {
    result[i] = addNumbers(v1[i], v2[i]);
  }
  return result;
}

const N = 100_000_000;
const v1 = new Float64Array(N);
const v2 = new Float64Array(N);
for (let i = 0; i < N; i++) {
  v1[i] = Math.random();
  v2[i] = Math.random();
}

// Warm up.
for (let i = 0; i < 5; i++) {
  vectorSum(N, v1, v2);
}

// Measure.
console.time();
const result = vectorSum(N, v1, v2);
console.timeEnd();

在这个简化的改进中,我们能看到下面的改进:

该功能仍处于试验阶段,如果想要提前体验可以通过 --turbo-inline-js-wasm-calls 标志启用。

你可以使用 git log branch-heads/8.9..branch-heads/9.0 include/v8.h 来获取所有 v9.0 版本的API更改。

在看点这里 ⬇️

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 code秘密花园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正则匹配索引
  • 更快的 super 属性访问
  • 禁用 for ( async of 写法
  • 更快的 JS-to-Wasm 调用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档