iOS性能优化-卡顿检测和优化

*易的面试中的,面试官问了我一个如何检测页面卡顿的问题。当时没有回答好,所以来总结一下。

问题

1.如何检测iOS页面卡顿。
2.检查到卡顿的时候,需要将所有线程的堆栈信息,CPU,内存信息写入本地日志文件。

页面卡顿的原因

导致卡顿问题的几种原因:

  • 复杂UI,图文混排的绘制量过大;
  • 在主线程上做网络同步请求;
  • 在主线程做大量的IO操作;
  • 运算量过大,CPU持续高占用;
  • 死锁和主子线程抢锁。

卡顿的检查方案

通过监控主线程的RunLoop的状态来判断是否出现卡顿。将创建好的观察者 runLoopObserver 添加到主线程 RunLoop 的 common 模式下观察。然后,创建一个持续的子线程专门用来监控主线程的 RunLoop 状态。一旦发现进入睡眠前的 kCFRunLoopBeforeSources 状态,或者唤醒后的状态 kCFRunLoopAfterWaiting,在设置的时间阈值内一直没有变化,即可判定为卡顿。

我自己实践的代码

参考资料

13 | 如何利用 RunLoop 原理去监控卡顿?

Matrix-iOS 卡顿监控

微信iOS卡顿监控系统

iOS实时卡顿检测-RunLoop(附实例)

深入理解RunLoop