iOS界面启动耗时检测

背景:

近期在做公司内部使用的iOS应用性能检测组件及项目性能优化的工作,有个需求是能量化的统计各个界面的启动耗时。

通常,项目中页面启动的耗时长短通常肉眼可见,但当我们在对项目进行界面启动耗时优化时,我们通常需要知道VC启动耗时的数据,并收集进行对比,此时我们需要能够实现记录界面启动耗时的数据来进行量化的分析。


方案分析:


UIViewControlle生命周期图

通常这种通用的需求,我们首先想到的方案便是使用AOP,针对VC的生命周期方法进行swizzle,打点记录每个生命周期方法的时间点,即可获取VC的耗时。但是实际实践这种方案存在一个弊端,因为我们hook 的是UIViewController的方法,果我们在自己的 VC 中重写了对应的方法,并执行了一些耗时的操作,那么这些操作的时间就没有被计算进去。所以,基于这个方案,需要做进一步的改进。


目前使用的改进方案是:

1.对需要监听的类的实例化时进行KVO,监听一个不存在的KeyPath。通过它来创建子类。

2.对KVO创建出来的子类添加需要Swizzle的方法对应的SEL及其IMP。因为本质上KVO只是对setter和getter方法进行了override,如果不提供自定义的实现,还是会调用到原来的类的IMP。

3.在实例销毁的时候,将KVO监听移除,避免导致KVO still registering when deallocated这样的Crash。

4.对于记录的界面耗时记录信息,收集到一份列表中,有一个recorder类维护列表,并提供一个List界面进行展示,可以在程序中直接查看检测数据。


具体实现可见我的Github


参考:

巧妙利用KVO实现精准的VC耗时检测

一种基于KVO的页面加载,渲染耗时监控方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,520评论 8 265
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,757评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 一、基础知识点 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去...
    软件iOS开发阅读 1,298评论 0 26
  • 成果框架的四个部分: 1、积极正向的;我想报考一建,挑战一下自己 2、在可控的范围;我可以保证绝对我去参加考试 3...
    Eva_2115阅读 542评论 0 0