iOS App启动优化(二):物理内存和虚拟内存markdown
iOS App启动优化(四):编译期插桩 && 获取方法符号ide
iOS App启动优化(五):收集符号 && 生成 Order File函数
APP
被后台kill
后从新启动APP
,这种启动方式叫作冷启动。APP
的状态由running
切换为suspend
,APP
没有被kill
仍然在后台运行。再次把APP
切换到前台,这种启动方式叫热启动。main()
函数做为关键点分割成两块t1
阶段,main()
以前的处理所需时间,称为pre-main
t2
阶段,main()
及main()
以后处理所需时间pre-main
t2
阶段耗时的主要是业务代码oop
推荐 BLStopwatch,这个工具能够打点统计业务耗时post
本部分优化根据各自业务需求自行处理性能
pre-main
时间经过添加环境变量能够获取到pre-main
阶段的时间 测试
DYLD_PRINT_STATISTICS
Xcode
中提供了测量 pre-main
的时间 Edit scheme -> Run -> Auguments
添加环境变量 DYLD_PRINT_STATISTICS
,value
设为YES
。
启动之后能够看到启动时长
dylib
分析每一个dylib
(大部分是系统的),找到其Mach-O
文件,打开并读取验证有效性;找到代码签名注册到内核,最后对dylib
的每一个segment
调用mmap()
。
在dylib
的加载过程当中系统为了安全考虑引入了ASLR
(Address Space Layout Randomization
)技术和代码签名。
ASLR
技术:镜像Image
、可执行文件、dylib
、bundle
在加载的时候会在其指向的地址(preferred_address
)前面添加一个随机数误差(slide
),防止应用内部地址被定位。
dylib
加载完成以后,它们处于相互独立的状态,须要绑定起来。
Rebase
将镜像读入内存,修正镜像内部的指针,性能消耗主要在IO
。
Bind
是查询符号表,设置指向镜像外部的指针,性能消耗主要在CPU
计算。
runtime
会维护一张类名与类的方法列表的全局表。
class registration
)category registration
)selector
的惟一性(selector uniquing
)这部分其实就是load
方法的耗时
DYLD_PRINT_STATISTICS_DETAILS
还能够获取更详细的时间,添加环境变量DYLD_PRINT_STATISTICS_DETAILS
,value
设为YES
。
load()
方法里执行操做,把操做推迟到initialize()
方法继续了解优化请移步 iOS App启动优化(二):物理内存和虚拟内存