iOS 开发每天分享优质文章收藏

微信iOS卡顿监控系统

2019-05-29  本文已影响45人  Crazy2015
界面卡顿是由哪些原因导致的?
针对这些原因,我们可以怎么定位问题呢?

如果可以将当时的线程堆栈捕捉下来,那么上述难题都迎刃而解。主线程在什么函数哪一行卡住,在等什么锁,而这个锁又是被哪个子线程的哪个函数占用,有了堆栈,我们都可以知道。自然也能知道是慢在UI绘制,还是慢在我们的代码。

所以,思路就是起一个子线程,监控主线程的活动情况,如果发现有卡顿,就将堆栈 dump 下来

流程图描述如下:
image.png

细节
原理一旦讲出来,好像也不复杂。魔鬼都是隐藏在细节中,效果好不好,完全由实现细节决定。具体到卡顿检测,有几个问题需要仔细处理:

1. 判断标准

怎么判断主线程是不是发生了卡顿?一般来说,用户感受得到的卡顿大概有三个特征:

看起来 FPS 能够兼容后面两个特征,但是在实际操作过程中发现 FPS 不好衡量,抖动比较大。而对于抢锁或大量 IO 的情况,光有 CPU 是不行的。所以我们实际上用到的是下面两个准则:

2. 检测策略

为了降低检测带来的性能损耗,我们仔细设计了检测线程的策略:

3. 分类方法

直接用 crash report 的分类方法是不行的,这个很好理解:最终卡在 lock 函数的卡顿,外面可能是很多不同的业务,例如可能是读取消息,可能是读取联系人,等等。卡顿监控需要仔细定义自己的分类规则。可以是从调用堆栈的最外层开始归类,或者是取中间一部分归类,或者是取最里面一部分归类。各有优缺点:

转载地址:
https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ%3D%3D&idx=1&mid=207890859&scene=23&sn=e98dd604cdb854e7a5808d2072c29162&srcid=0921FzoCw9j1W7n4uFYKuarC#rd

上一篇下一篇

猜你喜欢

热点阅读