0%

iOS-性能监控(第二期)

第二期:添加运行时的调试工具,帮助调试(自定义 time profiler)

统计方法调用时长

运行时懒加载 swizzle 我们关心的方法: layoutSubviews,drawRect,cellForRow

懒加载保证了我们调用时机永远在调用栈最底下,这样我们在方法被调用之前记录一个时间(start time),原始实现调用之后记录一个时间(end time),得到一个方法调用时长(duration)。

ViewController 初始化时hook页面周期相关方法

为此测试了在初始化的时候 hook 的效率问题。初始化 2000 个不同的 vc(事先用脚本创建好),奇数 hook, 偶数不 hook,计算耗时的平均值、最大值、最小值。结果是两组数字之间的差异不大。

统计页面的加载时间

这里有一个测试可行性的demo
后期应用在项目里的时候进行了一些优化,并没有更新在 Github 上,不过不影响,如果有人希望有完整代码可以参考可以告知我,我抽时间整理一下。

卡顿可视化

掉帧是一个主观性很强的感觉。我们需要把掉帧这种行为用数据、颜色表示出来。
特别是当一个列表页大部分情况下很流畅,但是只在一瞬间掉一两帧,这种情况直接用 Instruments 很难分析出需要优化的地方。
所以设计了如下的方案,完美解决瞬间掉帧的事情。

添加 FPS lable:

提供两个CPU、GPU 两种帧率显示

每个 Cell 添加耗时 Label

动态给每个 Cell 添加几个 Layer,放在左上角。显示 cellForRow 调用时长、所有子 View layoutSubviews 等方法调用的时长

UIView 染色

View 根据 layoutSubiew 和 drawRect 方法调用的时长进行染色(非常耗时的涂红,不太耗时涂白)

1
2
///  0 <= costLevel <= 1
layer.backgroundColor = [r: 1 g:1-costLevel b:1-costLevel]

布局、绘制行为记录

记录运行时所有的行为,方便分析

抓取业务数据

卡顿的瞬间记录 Cell 层次结构

1
[view recursiveDescription]

label text 等信息