《今日The Fast and the Curious文章探讨了Chrome如何在新的Speedometer 3.0上取得最高分,这是一个升级版的浏览器性能基准测试工具,用于优化Web应用程序的性能。今天就来试试Chrome吧!》
Speedometer 3.0 是最近发布的一项用于衡量浏览器性能的基准测试,它是Google、Apple、Mozilla、Intel和Microsoft等行业公司之间的协作成果。这一基准测试帮助我们确定了可以优化Chrome的领域,以便为我们的所有用户提供更快的浏览器体验。
以下是我们如何进一步优化Chrome以在Speedometer 3上取得历史最高分的详细情况,我们通过仔细追踪随着更新的基准测试开发过程中Chrome的近期表现。自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的文本时提高了速度。
选择正确的代码进行专注
实现高性能的一个重要策略是提升代码层级,即在引擎内选择正确的代码进行进一步优化。Intel为V8贡献了基于性能分析的层级提升,它记住了过去的层级提升决策,以便如果一个函数过去稳定地提升了层级,我们将在未来的运行中迅速提升它。
改进垃圾收集
另一个推动Speedometer 3上大约3%进步的领域是垃圾收集的改进。V8的垃圾收集器有长期利用渲染器空闲时间的历史 以避免干扰实际应用程序代码。最近的变化遵循这一精神,通过扩展现有机制,尽可能在其他非常活跃的渲染器上优先在空闲时间进行垃圾收集。具体来说,现在在回收对象时运行的DOM终结代码现在也在空闲时间运行。以前,这样的操作会与常规应用程序代码争夺CPU资源。此外,V8现在支持一种更紧凑的对象布局,用于包装DOM元素的对象,即所有暴露给JavaScript框架的对象。紧凑的布局减少了内存压力,导致在垃圾收集上花费的时间减少。