1.查看当前项目APP启动时缺页调度情况
1.1 在项目可以正常Debug的条件下,在Xcode中以快捷键 command+i打开Xcode内置的instruments应用
1.2 选择
System Trace选项,点击左上角启动记录,这时会自动运行项目
1.3 当APP启动 显示出项目第一个页面,再次点击上文按钮 结束记录并开始分析,分析结束后在列表中找到对应项目
1.4 点击项目左侧箭头展开列表,选择Main Thread,并将展示数据切换为Virtual Memory虚拟内存视图
1.5 从统计数据可以看出 File Backed Page In 数据项再启动耗时中占据绝大部分 优化该部分耗时将对app启动优化起到至关重要的作用
2.app加载(链接)顺序统计
2.1 Xcode内置了项目SanitizerCoverage统计功能,默认关闭,先将其打开。项目build setting搜索 link map,将Write Link Map File设置为YES,并设置文件存放地址,可以自定义,推荐填入$(TARGET_TEMP_DIR)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt,注意,这里的路径填写使用固定的标识符
2.2 Debug模式运行项目,Xcode将会根据自有插桩写入项目SanitizerCoverage信息到上文指定文件。
2.3 通过Xcode -> Product -> Show Build Folder in Finder 再根据2.1中配置的文件地址找到统计文件。其中为基于Xcode自带Clang插桩统计的SanitizerCoverage。当前应为未进行二进制重排前的状态。保存该文件以便二进制重排后对比。
3.载入order文件重排函数链接顺序
3.1 利用Clang插桩获取实际的函数链接顺序,可以使用自定义Clang插桩,也有较为完善的第三方库,这里使用 AppOrderFiles生成函数链接文件。具体引入第三方库步骤参考
3.2 引入AppOrderFiles并运行项目,打印.order文件地址后,点击Xcode -> Window -> Devices and Simulators 找到项目并点击 Download Container 下载
3.3 下载文件打开后根据上文打印的.order文件地址找到对应文件,打开文件可以看到其中为函数链接顺序。将该.order文件放入项目目录,并在Xcode的项目Build Setting搜索 Order File,并将.order文件地址填入
4.重排前后对比
4.1 再次运行项目,重复1.1-1.5步骤对比 File Backed Page In 数据变化。
重排前
重排后
4.2 重复2.1-2.3对比SanitizerCoverage信息中函数调用顺序前后区别以及与.order文件内的区别,发现二进制重排后的函数调用顺序与.order文件高度吻合,这样就实现了重排函数连接顺序,调整函数实现在内存页中的分布,提高内存页的利用率,减少page fault时间,从而提高app启动性能。