Javascript运行时V8比以往更快、更安全!


通过创新的性能优化,V8 不断突破不断发展的 Web 领域的可能性界限。我们引入了新的中间层编译器,并对顶级编译器基础架构、运行时和垃圾收集器进行了多项改进,从而全面提升了速度。

下面,我们概述了这一年的一些主要亮点。

Maglev:新的中间层优化编译器
我们推出了一款名为 Maglev 的全新优化编译器,其战略地位介于现有的 Sparkplug 和 TurboFan 编译器之间。
它作为高速优化编译器,以惊人的速度高效生成优化代码。
它生成代码的速度比我们的基准非优化编译器 Sparkplug 慢约 20 倍,但比顶级 TurboFan 快 10 到 100 倍。

据我们观察,Maglev 的性能有了显著提高,JetStream 提高了 8.2%,Speedometer 提高了 6%。磁悬浮编译速度更快,减少了对 TurboFan 的依赖,因此在 Speedometer 运行期间,V8 的总能耗降低了 10%。

虽然 Maglev 还没有完全完成,但其目前的状态证明了在 Chrome 117 中推出 Maglev 是正确的。

Turboshaft:顶级优化编译器的新架构
我们还为顶级优化编译器 Turbofan 引入了新的内部架构 Turboshaft,使其更易于扩展新的优化功能,编译速度也更快。

自 Chrome 120 开始,与 CPU 无关的后端阶段全部使用 Turboshaft 而不是 Turbofan,编译速度比以前快了一倍左右。这不仅节省了能源,还为明年及以后更令人兴奋的性能提升铺平了道路。

更快的 HTML 解析器
我们发现,基准测试时间的很大一部分都消耗在了 HTML 解析上。虽然这并不是 V8 的直接改进,但我们还是采取了主动,运用我们在性能优化方面的专业知识,为 Blink 添加了更快的 HTML 解析器。这些变化使速度计得分显著提高了 3.4%。

加快 DOM 分配
我们还积极投资 DOM 方面。我们对 DOM 对象分配器 Oilpan 的内存分配策略进行了重大优化。它获得了一个页面池,显著降低了内核往返的成本。

现在,Oilpan 支持压缩和非压缩指针,我们避免压缩 Blink 中的高流量字段。考虑到解压缩的执行频率,这对性能的影响非常广泛。

此外,在了解了分配器的速度后,我们对频繁分配的类进行了 Oilpan 化处理,这使得分配工作负载的速度提高了 3 倍,并在《速度计》等 DOM 繁重的基准测试中取得了显著改善。

JavaScript 的新功能
JavaScript 不断发展新的标准化功能,今年也不例外。我们发布了可调整大小的 ArrayBuffers 和 ArrayBuffer Transfer、String isWellFormed 和 toWellFormed、RegExp v flag(又称 Unicode set 符号)、JSON.parse with source、Array grouping、Promise.withResolvers 和 Array.fromAsync。

不幸的是,在发现一个网络不兼容问题后,我们不得不取消迭代器助手的发布,但我们已与 TC39 合作修复了该问题,并将很快重新发布。

最后,我们还取消了一些针对 let 和 const 绑定的冗余时间死区检查,从而使 ES6+ JS 代码变得更快。

WebAssembly 垃圾收集WasmGC
经过数年的标准化和实施工作,我们终于推出了 WebAssembly 垃圾收集(WasmGC)。

Wasm 现在有了一种内置方法,可以分配由 V8 现有垃圾回收器管理的对象和数组。

这样,用 Java、Kotlin、Dart 和类似垃圾回收语言编写的应用程序就可以编译到 Wasm,其运行速度通常是编译为 JavaScript 时的两倍。

安全
在安全方面,我们今年的三大主题是沙箱、模糊处理和 CFI。

  • 在沙箱方面,我们专注于构建缺失的基础设施,如代码和可信指针表。
  • 在模糊处理方面,我们投资了从模糊处理基础架构到特殊用途模糊器和更好的语言覆盖范围等所有方面。
  • 最后,在CFI方面,我们为我们的CFI架构奠定了基础,以便它能在尽可能多的平台上实现。

除此以外,一些规模较小但值得关注的工作还包括缓解流行的漏洞利用技术 "the_hole "的工作,以及以 V8CTF 形式推出的新漏洞利用赏金计划。