iOS启动优化 —— 二进制重排

本文探讨了iOS应用的启动过程,包括冷启动与热启动的区别,以及启动优化的重点。主要关注二进制重排在减少pageFault次数和优化启动时间上的作用,介绍了如何通过配置Write Link Map File和创建order文件来实现二进制重排,以提高app启动性能。同时,文章还讲解了虚拟内存、物理内存、缺页中断的概念及其在内存管理中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. app启动

启动的过程一般是指从用户点击app图标开始到AppDelegate 的didFinishLaunching方法执行完成为止,其中,启动也分为冷启动和热启动:

  • 冷启动:第一次打开app或app被杀死后重新打开叫冷启动(走didFinishLaunchWithOptions方法)
  • 热启动:app在后台且存活的状态下,再次打开app叫热启动(不走didFinishLaunchWithOptions方法)

启动优化通常指的是冷启动优化,冷启动一般分为两个部分,

  • main函数之前 :一般叫做pre-main阶段,指的是唤起 App 到 main() 函数执行之前的过程。
  • main函数之后:从main函数 到Appdelegate 的didFinishLaunching方法执行完成为止。

我们可以在 Xcode 中配置环境变量 DYLD_PRINT_STATISTICS来查看pre-main阶段的耗时(Edit Scheme -> Run -> Arguments ->Environment Variables点击+添加环境变量 DYLD_PRINT_STATISTICS),配置之后运行。这里可以看到pre-main阶段一共用了171.53ms
在这里插入图片描述

  • dylib loading time(动态库耗时):主要是加载动态库。动态库载入耗时是难以避免的,因为只要有动态库,就会去载入,并且如果动态库有依赖关系的话,就会消耗时间去查找读取。苹果的系统库则有点不一样,因为它已经载入到内存了,已经在共享缓存空间,并且已经做了非常高速的优化,但是我们自定义的动态库则没有优化。所以苹果给我们一个建议就是动态库的个数不要大于6个。如果大于6个,那么尽可能的去进行动态库的合并。
  • rebase/binding time:偏移修正/符号绑定耗时
    • rebase(偏移修正):任何一个app生成的二进制文件,在二进制文件内部所有的方法、函数调用,都有一个地址,这个地址是在当前二进制文件中的偏移地址。每次启动的时候,系统都会随机
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值