App启动速度优化.----<iOS开发高手课>笔记
2019-04-09 本文已影响0人
王四猫
App的启动主要包括三个阶段:
- main()函数执行前;
- main()函数执行后;
- 首屏渲染完成后.
main()函数执行前
在main()函数执行前.系统主要会做下面几件事:
- 加载可执行文件(App的.o文件集合);
- 加载动态链接库,进行rebase指针调整和bind符号绑定;
- Objc运行时的初始处理,包括Objc相关类的注册,category注册,selector唯一性检查等;
- 初始化,包括了执行+load()方法,attribute((constructor))修饰的函数的调用,创建C++静态全局变量.
相应地,这个阶段对于启动速度优化来说,可以做的事情包括: - 减少动态库加载.每个库本身都有依赖关系,苹果公司建议使用更少的动态库,并且建议在使用动态库数量较多时,尽量将多个动态库合并.数量上,苹果公司最多可以支持6个非系统动态库合并为一个.
- 减少加载启动后不会使用的类或方法.
- +load()方法里的内容可以放到首屏渲染后再执行.或者使用+initialize()方法替换掉.因为在一个+load()方法里,进行运行时方法替换操作会带来4毫秒的消耗.
main()函数执行后
main()函数执行后阶段,指的是从main()函数执行开始,到appDelegate 的didFinishLaunchingWithOptions方法里首屏渲染相关方法执行完成.
首页的业务代码逻辑都是在这个阶段,也就是首屏渲染前执行的,主要包括:
- 首屏初始化所需配置文件的读写操作;
- 首屏列表大数据的读取;
- 首屏渲染的大量计算.
优化方式是从功能上梳理哪些是App启动必须的初始化功能,哪些是对应功能开始使用时才需要初始化的,将这些初始化功能放到合适的位置.
首屏渲染完成后
这个阶段是从渲染完成开始,到didFinishLaunchingWithOptions方法作用于结束时结束.
这个阶段用户已经能看到App首页信息了.
功能级别的启动优化
- 第一种方法是,定时抓去主线程上方法的调用堆栈,计算一段时间的各个方法的耗时。
Xcode工具自带的Time Profiler采用的就是这个方式。(个人决定选择这种简单实现方式) - 对objc_msgSend方法进行hook来掌握所有方法的执行耗时。
优点是非常精确,缺点是只能针对OC方法。
戴铭老师技术层次非常的高,这次的课程也是干货满满,我将他所讲述的课程中我当前能理解的部分以笔记的形式誊录下来。有兴趣的同学非常推荐在极客学院购买他的课程来获取全部内容。