V8 发布 v7.2
每六周,我们会根据我们的发布流程创建一个新的 V8 分支。每个版本都在 Chrome Beta 的里程碑之前从 V8 的 Git 主分支分出。今天我们很高兴宣布最新的分支 V8 版本 7.2,其将在未来几周与 Chrome 72 稳定版同步发布。目前处于 Beta 状态。V8 v7.2 充满了各种面向开发者的好功能。这篇文章提供了即将发布的亮点预览。
内存
嵌入式内建函数现在支持并默认在 IA32 架构上启用。
性能
JavaScript 解析
平均来说,网页启动时花费的 V8 时间中有 9.5% 用于解析 JavaScript。因此,我们重点优化了 V8 并在 v7.2 中实现了最快的 JavaScript 解析器。解析速度显著提高。从 v7.0 开始,桌面端的解析速度大约提高了 30%。以下图表记录了最近几个月中我们在 Facebook 实际加载基准测试中的令人印象深刻的改进。
我们在不同的情况下都集中关注了解析器。以下图表显示了相对于最新 v7.2 版本在几个常见网站上的改进。
总之,最近的改进使解析时间的平均占比从 9.5% 降低到 7.5%,从而加快了加载时间,使页面响应更快。
async
/await
V8 v7.2 提供了更快的 async
/await
实现,默认启用。我们提出了规范提案,目前正在收集网络兼容性数据,以便将更改正式合并到 ECMAScript 规范中。
展开元素
当展开元素出现在数组字面量的前面,例如 [...x]
或 [...x, 1, 2]
时,V8 v7.2 显著提高了性能。此改进适用于展开数组、原始字符串、集合、映射键、映射值,以及由此扩展的 Array.from(x)
。有关更多详细信息,请参阅我们关于加速展开元素的深入文章。
WebAssembly
我们分析了一些 WebAssembly 基准测试并利用它们指导顶级执行层的代码生成改进。特别是,V8 v7.2 在优化编译器的调度器中启用了节点拆分,并在后端引入了循环旋转。此外,我们改进了包装器缓存并引入了自定义包装器,从而减少调用导入的 JavaScript 数学函数的开销。此外,我们设计了一些寄存器分配器的更改,这些更改提高了将在以后的版本中实现的许多代码模式的性能。
陷阱处理器
陷阱处理器提高了 WebAssembly 代码的一般吞吐量。它们已经在 V8 v7.2 中实现并可用于 Windows、macOS 和 Linux。它们已经在 Chromium 的 Linux 上启用。当稳定性得到确认后,Windows 和 macOS 也将开启。目前我们正在努力让它们在 Android 上也可用。
异步堆栈跟踪
正如之前提到的,我们添加了一项称为零成本异步堆栈跟踪的新功能,它通过异步调用帧丰富了 error.stack
属性。目前可以通过 --async-stack-traces
命令行标志启用。
JavaScript 语言功能
公共类字段
V8 v7.2 增加了对公共类字段的支持。以往的写法如下:
class Animal {
constructor(name) {
this.name = name;
}
}
class Cat extends Animal {
constructor(name) {
super(name);
this.likesBaths = false;
}
meow() {
console.log('喵喵!');
}
}
现在可以这样写:
class Animal {
constructor(name) {
this.name = name;
}
}
class Cat extends Animal {
likesBaths = false;
meow() {
console.log('喵喵!');
}
}
对私有类字段的支持计划在未来的 V8 版本中实现。
Intl.ListFormat
V8 v7.2 增加了对Intl.ListFormat
提案的支持,从而启用列表的本地化格式化。
const lf = new Intl.ListFormat('en');
lf.format(['Frank']);
// → 'Frank'
lf.format(['Frank', 'Christine']);
// → 'Frank and Christine'
lf.format(['Frank', 'Christine', 'Flora']);
// → 'Frank, Christine, and Flora'
lf.format(['Frank', 'Christine', 'Flora', 'Harrison']);
// → 'Frank, Christine, Flora, and Harrison'
欲了解更多信息和使用示例,请查看我们的 Intl.ListFormat
说明文档。
合理格式的 JSON.stringify
JSON.stringify
现在为独立代理添加了转义序列,使其输出为有效的 Unicode(可以用 UTF-8 表示):
// 旧行为:
JSON.stringify('\uD800');
// → '"�"'
// 新行为:
JSON.stringify('\uD800');
// → '"\\ud800"'
欲了解更多信息,请参阅我们的合理格式 JSON.stringify
说明文档。
模块命名空间导出
在JavaScript 模块中,已经可以使用以下语法:
import * as utils from './utils.mjs';
然而,以前并不存在对称的 export
语法...直到现在:
export * as utils from './utils.mjs';
这等同于以下内容:
import * as utils from './utils.mjs';
export { utils };
V8 API
请使用 git log branch-heads/7.1..branch-heads/7.2 include/v8.h
获取 API 变更列表。
拥有活跃的 V8 checkout 的开发者可以使用 git checkout -b 7.2 -t branch-heads/7.2
对 V8 v7.2 的新功能进行实验。或者,您可以订阅 Chrome 的 Beta 频道,并很快自己尝试新功能。