MotionMark 浏览器图形性能测试套件深入分析

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: [MotionMark][1] 是 Apple 开发的一个浏览器图形性能测试套件,用来[测试和评估 Safari/WebKit 的图形性能][2],这里的图形性能并不仅仅包括光栅化和合成,而是涵盖了完整的浏览器渲染流水线,包括 DOM API,样式计算,排版等。 MotionMark 虽然不能涵盖浏览器图形性能的所有方面,但是作为衡量浏览器图形性能的其中一项指标,还是有不错的参考价值。Ch

MotionMark 是 Apple 开发的一个浏览器图形性能测试套件,用来测试和评估 Safari/WebKit 的图形性能,这里的图形性能并不仅仅包括光栅化和合成,而是涵盖了完整的浏览器渲染流水线,包括 DOM API,样式计算,排版等。

MotionMark 虽然不能涵盖浏览器图形性能的所有方面,但是作为衡量浏览器图形性能的其中一项指标,还是有不错的参考价值。Chromium 目前也会使用 MotionMark 分数作为其中一项指标来衡量自身图形性能优化的成果。

关于浏览器渲染请参考我之前的一些文章,比如渲染流水线中的光栅化

MotionMark 的一个主要特性是自适应动态调整测试的复杂度,从而更好地适应不同的设备,这些设备的性能可能差异很大,比如 PC 的性能通常几倍甚至十倍于移动设备。MotionMark 的每一项测试都包含一个连续的动画,它收集动画每一帧的复杂度和耗时等数据,然后计算出一个分数(复杂度越高,耗时越少,分数就越高),最后根据所有项目的成绩计算出一个总得分,分数越高代表性能越好。

因为 MotionMark 动态调整复杂度的缘故,导致测试的结果波动较大,所以除了分数外,测试还给出一个波动范围,通常需要测试多次,取波动值较小的为准。

这篇文章主要分析 MotionMark 每一项测试的测试内容,在 Chromium 上,该项测试的主要性能瓶颈在哪里,是在 DOM,是在样式计算和排版,还是在光栅化和合成。如果读者对浏览器的图形性能感兴趣,可以通过这篇文章更好地了解如何通过 MotionMark 的成绩来衡量浏览器的图形性能。

用于分析的 Chromium 版本是 Chrome 77 for Android,我们可以看到从 75 开始,Chrome for Android 已经正式开启了 OOPR,普通图层分块光栅化的主要耗时从原来的光栅化线程(CompositorTileWorker)相当大的一部分转移到了 GPU 线程(CrGpuMain),光栅化的耗时在两个线程上都有一定的比例。测试的设备是 Google Pixel 手机。因为不同的设备有可能有不同的性能瓶颈,所以文章的结论不是普适的,只能作为一个参考。

各项测试分析

Multiply

Multiply

测试 CSS border radius,transform,opacity 动画的性能。测试过程中不断改变一组 div 元素的样式,包括背景色(带半透明),transform 和可见性,div 设置了 border radius 属性用来绘制圆角。

Multiply

在 Chromium 上,主要的性能瓶颈是在 Renderer,耗时最多的部分是 DOM API(改变样式),样式计算,重排版,图层树更新(重新绘制),图层光栅化部分耗时也较多,但是相对而言较前者要少。留意上图 CrRendererMain 和 CrGpuMain 线程上调用耗时的比例。

Canvas Arcs

Arcs

测试 Canvas 路径绘制(弧形路径,包括描边和填充)的性能。

Arcs

在 Chromium 上,主要的性能瓶颈是在 Renderer,耗时最多的部分是 DOM API(Canvas API),和 Skia 的路径绘制(Canvas 的光栅化)。

Leaves

Leaves

测试 CSS transform 动画的性能,大量的较小的 img 元素在动画过程被改变 transform。

Leaves

这个测试在 Chromium 上的结果比较吊诡,并不能真实反映 Chromium 在普通页面上 CSS transorm 动画的性能(通常只有少量元素同时做 transform 动画)。测试使用了大量尺寸较小的 img 元素,触发了 Chromium 的图层合并特性,将大量的小图层合并成一个大图层,它的副作用是导致了反复的图层重复光栅化。从上图可以看到,无论是在 Renderer 上的 DOM API(改变样式)和样式计算的耗时,还是图层光栅化的耗时(分布在光栅化线程和 GPU 线程)都不低,两者都可能成为性能瓶颈。

Canvas Paths

Paths

跟 Canvas Arcs 类似,也是测试 Canvas 路径绘制的性能,只是不是弧形而是各种不同的曲线。

Chromium 的性能瓶颈跟 Canvas Arcs 类似,主要的性能瓶颈是在 Renderer,耗时最多的部分是 DOM API(Canvas API),和 Skia 的路径绘制(Canvas 的光栅化)。

Canvas Lines

Lines

跟 Canvas Arcs/Paths 类似,测试 Canvas 线段绘制的性能。

Chromium 的性能瓶颈跟 Canvas Arcs/Paths 类似,主要的性能瓶颈是在 Renderer,耗时最多的部分是 DOM API(Canvas API),和 Skia 的线段绘制(Canvas 的光栅化)。

Focus

Focus

测试 CSS blur 和 opacity filter 动画的性能。动画过程中不断改变一组 div 元素的 transform 和 blur & opacity filter 的值。

Focus

Chromium 的主要性能瓶颈是在 GPU 线程的合成上,也就是 blur & opacity filter 效果的绘制。Renderer 在 DOM API(改变样式)上也有一定的开销,但是相对合成来说还是较低。

Images

Images

测试 Canvas getImageData 和 putImageData 的性能。动画过程中通过 get/putImageData 不断改变一组尺寸较小的 canvas 元素的内容。

Images

Chromium 悲剧地因为 getImageData 被阻塞,GL readPixels 从 GPU 读取纹理数据到 CPU 内存非常耗时。Safari 在这项上应该会有巨大的优势 -_-p

Design

Design

测试大量重复但是使用不同颜色的文本绘制的性能,重复的文本因为 transform 和 color 的差异形成投影的效果。动画过程中不断改变文本元素的 transform 和 color 属性。

Design

Chromium 主要的性能瓶颈反而是在 Renderer 的样式计算上面,文本的光栅化耗时也不少,不过比起 Renderer 的耗时稍微略少,也可能成为瓶颈。

Suits

Suits

大量使用不同的非矩形裁剪,不同渐变色,不同 transform 矩阵的 svg 元素的绘制,测试 svg 的绘制性能。

Suits

Chromium 在图层光栅化(SVG 的绘制)和 Renderer 的样式计算上耗时都不低,两者都有可能成为性能瓶颈。

结语

跟很多人第一直觉并不完全符合的是,浏览器的图形性能瓶颈,很多时候并不在真正的“图形”上面,也就是说光栅化和合成有时并不是动画的性能瓶颈,有时性能瓶颈反而是在 JavaScript(包括计算和 DOM API 调用),样式计算,和重排版上。当然,MotionMark 是一项压力测试,实际的应用中我们可能很少同时改变那么多元素的属性,但是如果页面碰到性能问题,在检查性能瓶颈时,这也是需要考虑的一个因素。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
8天前
|
运维 Prometheus 监控
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
|
1月前
|
缓存 监控 算法
软件测试中的性能瓶颈分析与优化策略
【10月更文挑战第6天】 性能测试是确保软件系统在高负载条件下稳定运行的重要手段。本文将深入探讨性能测试的常见瓶颈,包括硬件资源、网络延迟和代码效率等问题。通过具体案例分析,我们将展示如何识别并解决这些问题,从而提升软件的整体性能。最后,文章还将分享一些实用的性能优化技巧,帮助读者在日常开发和测试中更好地应对性能挑战。
82 3
|
2月前
|
监控 测试技术 持续交付
软件测试中的性能瓶颈分析与优化策略
性能瓶颈,如同潜伏于软件深处的隐形障碍,悄然阻碍着系统的流畅运行。本文旨在揭示这些瓶颈的形成机理,剖析其背后的复杂成因,并汇聚一系列针对性的优化策略,为软件开发者提供一套系统性的解决方案。
50 5
|
2月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
14天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
20天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
134 9
|
19天前
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
20 1
|
1月前
|
缓存 监控 测试技术
软件测试中的性能瓶颈分析与优化策略
本文深入探讨了在软件测试过程中,如何有效地识别和解决性能瓶颈问题。通过对性能瓶颈的定义、分类以及常见原因的分析,结合实际案例,提出了一系列针对性的优化策略和方法。这些策略旨在帮助测试人员和开发人员提高软件的性能表现,确保软件在高负载条件下依然能够稳定运行。
|
1月前
|
Web App开发 缓存 Linux
高效Selenium测试技巧:轻松控制已开启的浏览器
【10月更文挑战第13天】在进行Selenium测试时,通常会启动新浏览器实例,但有时需要控制已开启的浏览器,以节省时间并更真实地模拟用户行为。这可通过设置Chrome为可远程控制并使用`Remote WebDriver`连接实现。需在启动Chrome时添加`--remote-debugging-port`参数,并通过Python脚本中的`webdriver.Remote`连接至指定端口。此外,还可利用会话ID(Session ID)重新连接浏览器,提高测试灵活性。需要注意浏览器版本兼容性及元素定位稳定性等问题,确保测试准确性和一致性。
255 1
|
2月前
|
测试技术 持续交付 UED
软件测试的艺术与科学:平衡创新与质量的探索在软件开发的波澜壮阔中,软件测试如同灯塔,指引着产品质量的方向。本文旨在深入探讨软件测试的核心价值,通过分析其在现代软件工程中的应用,揭示其背后的艺术性与科学性,并探讨如何在追求技术创新的同时确保产品的高质量标准。
软件测试不仅仅是技术活动,它融合了创造力和方法论,是软件开发过程中不可或缺的一环。本文首先概述了软件测试的重要性及其在项目生命周期中的角色,随后详细讨论了测试用例设计的创新方法、自动化测试的策略与挑战,以及如何通过持续集成/持续部署(CI/CD)流程优化产品质量。最后,文章强调了团队间沟通在确保测试有效性中的关键作用,并通过案例分析展示了这些原则在实践中的应用。
72 1