V8 9.0
版本已经来到了测试阶段,将在数周内和 Chrome 90 Stable
一起发布,下面我们就先来预览一下这个版本中的一些亮点。
从 v9.0
开始,开发人员可以获取正则表达式匹配中匹配的捕获组的开始和结束位置的数组。当正则表达式带有 /d
标志时,这个数组可以通过匹配对象上的 .indices
属性获得。
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 了解更多介绍。
通过使用 V8
的内联缓存系统和 TurboFan
中优化的代码生成,对 super
属性(例如 super.x
)的访问进行了优化。通过这些更改, super
属性访问的性能将接近于常规属性访问,如下图所示。
for ( async of
写法这是一个被广泛讨论的语法分歧,Chrome 90 / V8 9.0
将明确禁止使用 for ( async of
,语法也不会再支持解析。
V8
对 WebAssembly
和 JavaScript
函数的参数使用了不同的表示方式。因此,当JavaScript
调用一个 WebAssembly
函数时,这个调用会经过一个所谓的 JS-to-Wasm
包装器,负责将参数从 JavaScript
域调整到 WebAssembly
域,并从相反的方向调整结果。
不幸的是,这样的操作性能损耗很大,所以 JavaScript
到 WebAssembly
的调用不如 JavaScript
到 JavaScript
的调用快。为了最大程度地减少这种性能开销,JS-to-Wasm
包装器现在可以内联到调用站点,从而简化代码并删除多余的框架。
假设我们有一个 WebAssembly 函数:
double addNumbers(double x, double y) {
return x + y;
}
假设我们从 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更改。
在看点这里 ⬇️