Chrome如何在Speedometer 3中创下历史最高性能得分

本文详细介绍了Chrome团队如何通过优化JavaScript执行、垃圾回收机制和代码分层策略,在Speedometer 3.0基准测试中实现72%的性能提升,包括具体的技术改进如SpaceSplitString优化、DOM解析加速和AAT字体渲染增强。

Chrome如何在Speedometer 3中创下历史最高性能得分

2024年6月6日 星期四

今天的《The Fast and the Curious》系列文章将探讨Chrome如何在全新的Speedometer 3.0中取得最高得分。Speedometer 3.0是近期发布的浏览器性能基准测试工具,由谷歌、苹果、Mozilla、英特尔和微软等公司共同合作开发。这个基准测试帮助我们发现可以优化Chrome的领域,为用户提供更快的浏览器体验。

以下是我们通过持续跟踪基准测试开发过程中的性能表现,进一步优化Chrome以在Speedometer 3中创下历史最高得分的详细技术解析。自2022年5月Speedometer 3启动以来,我们将Chrome的Speedometer得分提升了72%——这直接转化为用户的实际性能收益:

优化工作负载

通过分析Speedometer中的工作负载以及Chrome在哪些函数中花费最多时间,我们能够针对这些函数进行精准优化,从而提升Chrome的得分。例如:

  • SpaceSplitString函数被大量用于将空格分隔的字符串(如"class=‘foo bar’")转换为列表表示。我们在此函数中移除了一些不必要的边界检查
  • 当检测到重复的样式表时,我们对其进行去重并引用单个样式表实例
  • 通过调整内存分配,我们优化了绘制路径和圆弧的成本
  • 在创建表单编辑器时,我们检测到表单元素创建时发生的一些不必要处理
  • 在querySelector中,我们能够检测常用选择器并为其创建热路径

我们之前分享过如何使用专用快速路径优化innerHTML的解析实现,该实现也已纳入WebKit。由于Speedometer 3中的某些工作负载使用DOMParser,我们将相同的优化扩展到这方面,获得了另外1%的性能提升。

我们与Harfbuzz维护者合作,优化了Chrome渲染AAT字体(如Apple Mac OS系统字体)的方式。文本从处理的Unicode字符流开始,转换为字形流,然后通过AAT字体中定义的状态机运行。这项优化使我们能更快确定哪些字形实际参与状态机规则,从而在使用AAT处理文本时获得加速。

选择正确的代码进行优化

实现高性能的一个重要策略是代码分层——在引擎中选择正确的代码进行进一步优化。英特尔为V8贡献了配置文件引导的分层技术,该技术会记住过去的分层决策,如果某个函数在过去稳定地升级到更高层级,我们在后续运行中会主动将其升级。

改进垃圾回收

在Speedometer 3上带来约3%进展的另一个改进领域是垃圾回收。V8的垃圾收集器长期以来一直利用渲染器空闲时间,避免干扰实际应用程序代码。最近的更改遵循这一理念,扩展了现有机制,尽可能在非常活跃的渲染器的空闲时间进行垃圾回收。具体来说:

  • 现在在回收对象时运行的DOM终结代码也在空闲时间运行。以前,此类操作会与常规应用程序代码竞争CPU资源
  • V8现在支持为包装DOM元素(即暴露给JavaScript框架的所有对象)的对象提供更紧凑的布局。紧凑布局减少了内存压力,从而减少了垃圾回收时间

发布者:Thomas Nattestad,Chrome产品经理

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计