第二期:添加运行时的调试工具,帮助调试(自定义 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 | /// 0 <= costLevel <= 1 |
布局、绘制行为记录
记录运行时所有的行为,方便分析
抓取业务数据
卡顿的瞬间记录 Cell 层次结构
1 | [view recursiveDescription] |
label text 等信息