主要是为了确保有一个干净的测试环境, 不被其它因素所影响.
谷歌性能测试地址 googlechrome.github.io/devtools-sa…
国内性能测试地址: gitee.com/hellojamesz…
可以看到如下画面:
可以看到页面蓝色小方块在运动
有些用户电脑的CPU性能很好, 可能无法较好的分析问题(难以发现低端配置设备的性能问题), 所以需要降速.
在Chrome浏览器控制台中找到"Performance" => "CPU"选项, 选择降低4/6倍性能
上面已经限制了CPU的性能, 接下来需要寻找性能瓶颈了.
多次点击"Add 10", 向页面中添加小块, 直到感觉页面上小块运动时出现明显卡顿即可.
此时, 已经可以明显感觉到页面很卡顿了.
通过点击"Optimize"按钮, 可以提前感受下优化前后的效果对比
可以明显感受到优化前后页面的流畅度明显不一样.
如何分析问题, 肯定是要依赖数据, 这里需要使用到Chrome的Performance功能.
将页面切换至非优化的状态, 点击"Record".
录制的结果如下图所示:
以上数据初学者可能看不明白, 没关系, 我们来一步步了解各部分的含义
fps, 指页面每秒帧数
fps < 24
会让用户感觉到卡顿, 因为人眼的识别主要是24帧图中蓝色标记出的区域, 即FPS记录的信息 放大某一区域, 可以看到, FPS由两部分组成:
切换至已优化状态, 再进行录制后, 得到FPS数据如下:
可以看出:
上图中FPS下的位置, 即CPU信息 我们采集些一个真实业务的CPU数据, 这里我抓取的是个人简书的performance, 如下图所示:
对比可以发现, CPU数据的一些特性:
NET部分可以将屏幕逐帧录制下来, 能帮忙观察页面的状态, 分析首屏渲染速度
Frames部分, 主要用于查看特定帧的FPS, 可以查看特定的帧情况, 悬停其上, 可以查看数据.
可以看到:
点击某个Frames块, 可以查看到更加详细的数据
点击某个Frames块, 可以查看到更加详细的数据
在Chrome中, 还有一个More Tools选项, 选中"Rendering"选项
接着, 开启"FPS meter"选项
勾选后, 在页面上会出现一个FPS统计器, 如上图左上角.
暂时先不勾选"FPS meter", 不利于系统性学习
通过前面的内容, 我们已经知道页面有性能问题, 那接下来就要开始寻找原因了.
对性能进行录制完成时, 会默认在底部显示一个 Summary摘要, 显示全局信息.
上面展示了0~4.90s录制时间的具体耗时:
主要了解这3个耗时, 但了解这3个耗时, 对于哪有问题, 还需要进一步的排查.
上图红色框出部分, 就是Main, 其中每一块是每一帧中所做的事情
目前仍看不出什么. 为了方便观看, 我们可在fps, cpu, net模块, 点击一下, 缩小时间区间:
如上图所示, 通过缩小时间区间, 来实现放大Main中的内容. 现在已经能够看到, Main中展示的"火焰图", 即函数调用的堆栈. 其中:
上图中, 可以看到Animation Frame Fired右上角有一个红色三角号, 这是Chrome自动帮助识别出有问题的部分, 就像FPS中的红色一样, 用来识别问题
上图可以到提示"Warning: Recurring handler took 318.21 ms", 即重复处理程序耗时318.21ms
点击Animation Frame Fired下面的"Function Call"
如上图, 可以看到函数调用代码中的位置, 可以点击进行查看:
虽然定位到了, 是方法 update造成的问题, 但不够明确, 所以需要进一步探索.
可以看到, 每个紫色条都有一个红色的小三角, 前面提到"红色三角是Chrome帮助自动识别有问题的地方", 查看提示信息: "Forced reflow is a likely performance bottleneck.", 即强制回流可能是性能瓶颈
点击查看摘要.
可以看到, 问题定位在了 performanceTest.html的第136行, 点击查看, 能够看到是对每一个元素进行样式修改.
这段代码的问题在于, 在每个动画帧中, 它会更改每个方块的样式, 然后查询页面上每个方块的位置. 由于样式发生了变化, 浏览器不知道每个方块的位置是否发生了变化, 因此必须重新布局方块以计算其位置.
避免这种情况的出现, 可以参考: 避免大型、复杂的布局和布局抖动
可以看到, 优化后的状态, script, render的时间都大大减少了, 因此fps明显提高.
掘金: 一个Chrome 运行时性能瓶颈分析案例