【V8引擎博客翻译187】V8比以往更快更安全!

118 阅读6分钟

发布时间2023年12月14日·标记为JavaScriptWebAssembly安全基准

欢迎来到激动人心的V8世界,在这里,速度不仅是一项功能,更是一种生活方式。在我们告别2023年之际,是时候庆祝V8今年取得的令人印象深刻的成就了。

通过创新的性能优化,V8继续在不断发展的Web环境中推动可能的边界。我们引入了一个新的中间层编译器,并对顶层编译器基础设施、运行时和垃圾收集器进行了几项改进,从而全面提高了速度。

除了性能改进之外,我们还为JavaScript和WebAssembly带来了令人兴奋的新功能。我们还提供了一种新的方法,通过WebAssembly Garbage Collection(WasmGC)将垃圾收集的编程语言有效地带到Web上。

但我们对卓越的承诺并不止于此-我们还优先考虑安全。我们改进了沙箱基础设施,并在V8中引入了控制流完整性(CFI),为用户提供了更安全的环境。

下面,我们概述了今年的一些关键亮点。

Maglev:新的中间层优化编译器

我们引入了一个名为Maglev的新优化编译器,战略性地定位在我们现有的SparkplugTurboFan编译器之间。它作为一个高速优化编译器,以令人印象深刻的速度有效地生成优化代码。它生成的代码比我们的基准非优化编译器Sparkplug慢大约20倍,但比顶级TurboFan快10到100倍。我们已经观察到Maglev的显著性能改进,JetStream提高了8.2%,Speedometer提高了6%。Maglev更快的编译速度和减少对TurboFan的依赖,使V8在Speedometer运行期间的总能耗节省了10%。虽然还没有完全完成,磁悬浮的目前状态证明它在Chrome 117中的推出是合理的。更多细节在我们的博客文章

Turboshaft:顶层优化编译器的新体系结构

Maglev并不是我们在改进编译器技术方面的唯一投资。我们还引入了Turboshaft,这是我们的顶级优化编译器Turbofan的一个新的内部架构,使其更容易扩展新的优化和更快的编译。从Chrome 120开始,与CPU无关的后端阶段都使用Turboshaft而不是Turbofan,编译速度大约是以前的两倍。这既节省了能源,又为明年及以后更令人兴奋的性能提升铺平了道路。请留意更新!

更快的HTML解析器

我们观察到HTML解析占用了我们的基准测试时间的很大一部分。虽然不是对V8的直接增强,但我们采取了主动,并应用了我们在性能优化方面的专业知识,为Blink添加了一个更快的HTML解析器。这些变化导致Speedometer分数显著增加3.4%。对Chrome的影响是如此积极,以至于WebKit项目立即将这些更改集成到他们的存储库中。我们很自豪能够为实现更快的Web的共同目标做出贡献!

更快的DOM分配

我们也一直在积极投资于DOM方面。对Oilpan中的内存分配策略进行了显著的优化,Oilpan是DOM对象的分配器。它获得了一个页面池,这显著降低了到内核的往返成本。Oilpan现在支持压缩和未压缩的指针,我们避免在Blink中压缩高流量字段。考虑到解压缩的执行频率,它对性能有广泛的影响。此外,知道分配器有多快,我们对频繁分配的类进行了分区,这使得分配工作负载的速度提高了3倍,并在DOM繁重的基准测试(如Speedometer)上显示出显着的改进。

新的JavaScript功能

JavaScript继续随着新的标准化特性而发展,今年也不例外。我们提供了可调整大小的ArrayBuffersArrayBuffer transfer,StringisWellFormedtoWellFormedRegExp v flag(a.k.a. Unicode集表示法)、带源代码的JSON.parse数组分组Promise.withResolversArray.fromAsync。不幸的是,在发现Web不兼容后,我们不得不卸载迭代器帮助程序,但我们已与TC 39合作解决了该问题,并将很快重新发货。最后,我们还通过省略一些冗余的时间死区检查来使ES6+ JS代码更快letconst绑定。

WebAssembly更新

许多新特性和性能改进在今年登陆Wasm。我们启用了对多内存尾调用的支持(更多细节请参见我们的博客文章),并放宽了SIMD以释放下一级性能。我们已经完成了为您的内存需求应用程序实现memory 64,现在正在等待提案进入第4阶段,以便我们可以发布它!我们确保将最新的更新合并到异常处理建议中,同时仍然支持以前的格式。我们继续投资于JSPI,以便在Web上实现另一类应用程序。敬请期待明年!

WebAssembly垃圾收集

说到将新的应用程序类带到Web上,经过几年的标准化和实现工作,我们终于发布了WebAssembly垃圾收集(WasmGC)。Wasm现在有一种内置的方法来分配由V8现有垃圾收集器管理的对象和数组。这使得用Java、科特林、Dart和类似的垃圾收集语言编写的应用程序能够编译成Wasm --它们的运行速度通常是编译成JavaScript时的两倍。查看我们的博客文章了解更多细节。

安全

在安全方面,我们今年的三个主要主题是沙箱、模糊和CFI。在沙箱方面,我们专注于构建缺失的基础设施,如代码和可信指针表。在模糊方面,我们投资了从模糊基础设施到特殊用途模糊器和更好的语言覆盖的一切。我们的部分工作已在本演示文稿中介绍。最后,在CFI方面,我们为CFI架构奠定了基础,以便它可以在尽可能多的平台上实现。除此之外,一些较小但值得注意的努力包括减轻围绕“the_hole”的流行漏洞利用技术的工作,以及以V8CTF形式推出新的漏洞利用赏金计划。

结论

在这一年中,我们致力于许多增量性能增强。这些小项目的综合影响,沿着博客文章中详细介绍的那些,是巨大的!以下是V8在2023年实现的性能改进的基准分数,JetStream的整体增长为14%,Speedometer的整体增长为令人印象深刻的34%

scores.svg

这些结果表明,V8比以往任何时候都更快,更安全。系好安全带,开发人员朋友们,因为有了V8,进入快速而疯狂的Web之旅才刚刚开始!我们致力于使V8成为这个星球上最好的JavaScript和WebAssembly引擎!

从我们所有的V8,我们希望你一个快乐的假期充满了快速,安全和神话般的经验,你浏览网络!