简单监测iOS卡顿的demo

前言

本文的demo代码也会更新到github上。

做这个demo思路来源于微信team的:微信iOS卡顿监控系统
主要思路:通过监测Runloop的kCFRunLoopAfterWaiting,用一个子线程去检查,一次循环是否时间太长。
其中主要涉及到了runloop的原理。关于整个原理:深入理解RunLoop讲解的比较仔细。
以下就是runloop大概的运行方式:

其中UI主要集中在__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__(source0);
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__(source1);之前。
获取kCFRunLoopBeforeSourceskCFRunLoopBeforeWaiting再到kCFRunLoopAfterWaiting的状态就可以知道是否有卡顿的情况。

NSTimer的实现

具体代码如下:

主要内容是首先在主线程注册了runloop observer的回调myRunLoopObserver
每次小循环都会记录一下kCFRunLoopAfterWaiting的时间_waitStartTime,并且在kCFRunLoopBeforeWaiting制空。

另外开了一个子线程并开启他的runloop(模仿了AFNetworking的方式),并加上一个timer每隔1秒去进行监测。

如果当前时长与_waitStartTime差距大于2秒,则认为有卡顿情况,并记录了当前堆栈信息。

PS:整个demo写的比较简单,最后获取堆栈也仅获取了当前线程的堆栈信息([NSThread callStackSymbols]有同样效果),也在寻找获取所有线程堆栈的方法,欢迎指点一下。


更新:

了解到 plcrashreporter (github地址) 可以做到获取所有线程堆栈。


更新2:

这篇文章也介绍了监测卡顿的方法:检测iOS的APP性能的一些方法
通过Dispatch Semaphore保证同步这里记录一下。

写一个Semaphore版本的代码,也放在github上:

用Dispatch Semaphore简化了代码复杂度,更加简洁。

参考资料

1.微信iOS卡顿监控系统
2. iphone——使用run loop对象
3.深入理解RunLoop
4.检测iOS的APP性能的一些方法
5.iOS实时卡顿监控

1 1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部