iOS性能优化-启动优化-二进制重排(实践篇)

723 阅读2分钟

1.查看当前项目APP启动时缺页调度情况

1.1 在项目可以正常Debug的条件下,在Xcode中以快捷键 command+i打开Xcode内置的instruments应用 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,注意,这里的路径填写使用固定的标识符 link map 文件地址

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文件地址填入

配置order

4.重排前后对比

4.1 再次运行项目,重复1.1-1.5步骤对比 File Backed Page In 数据变化。 重排前

重排前 重排后

重排后 4.2 重复2.1-2.3对比SanitizerCoverage信息中函数调用顺序前后区别以及与.order文件内的区别,发现二进制重排后的函数调用顺序与.order文件高度吻合,这样就实现了重排函数连接顺序,调整函数实现在内存页中的分布,提高内存页的利用率,减少page fault时间,从而提高app启动性能。

链接对比