前言#
App 启动过程包括点击 App 图标到 app 出现首页渲染完成。这个启动过程是由三部分组成。第一部分 main 执行前(T1),第二 main 函数执行后到首页加载(T2),首页加载到渲染完成(T3)。
main 执行前的过程 T1#
可以通过 xcode 设置打印相应阶段耗时 设置方法:
只需要在 Edit scheme -> Run -> Environment Variables 中将环境变量 DYLD_PRINT_STATISTICS 设为 1,
T1 过程是可执行文件(.o)和 Dyld 加载到内存。Dyld 进行动态链接。再执行一系列动态链接操作和初始化操作的过程(加载、绑定、及初始化方法) 上图打印的过程是 Dyld 加载到内存后的操作。这些操作是 Dyld 进行的。下图来说明 Dyld 做了哪些工作。
优化#
动态库数量(非系统动态库合并,最多 6 个)合并动态库方法
objc 类,方法 数量减少
TEXT:objc_methname:中包含了代码中的所有方法,而DATAobjc_selrefs 中则包含了所有被使用的方法的引用,通过取两个集合的差集就可以得到所有未被使用的代码。可以objc_cover中的方法。
load 方法减少或者用+initialize() 代替。
C 的 constructor 与控制 C++ 全局变量的数量。
main 函数后 T2 阶段#
在 main()之后主要工作是各种集成的第三发启动项的执行。包括调试工具,页面配置,第三放统计以及功能的 sdk 开启等。
优化#
分阶段启动
页面配置相关的可以在 willFinishLaunch 阶段被执行,功能 sdk 可以放在首页加载完成后启动。
规范启动项添加 输出文档规范
组件话的话使用 自动注册启动。
首屏页面的加载和渲染 T3 阶段#
主界面的构建,例如 TabBarVC,HomeVC 等等,网络资源的加载,如图片 I/O、图片解码、控件的布局。可以查看主线程上这些方法的执行时间了解哪些方法耗时多,然后进行优化。
Time Profiler#
Time Profiler 是 Xcode 自带的时间性能分析工具,它按照固定的时间间隔来跟踪每一个线程的堆栈信息,通过统计比较时间间隔之间的堆栈状态,来推算某个方法执行了多久,并获得一个近似值。就是或者方法的执行时间。Time Profiler 使用
小结:定时抓取主线程上的方法调用堆栈,计算一段时间里各个方法的耗时原因,自己可以实现相应功能的工具,集成到自己的 App 中,以便在真实环境中进行检查。或者利用fishhook与 objc_msgSend 汇编相关知识实现耗时方法的打印。相关开源里使用GCDFetchFeed中 SMCallTrace 部分。不止主页面其他页面的加载也可以使用它定位加载慢的问题。
优化#
- 串行改并行
- io 操作使用资源较小的代替
- 利用闪屏加载首屏
- 首屏使用代码布局
- 网络资源的预缓存
- 首页测试代码进行删除