扫一扫关注公众号,得到更多iOS相关内容bash
这篇文章会给你们介绍一下关于启动优化,咱们能够从哪些方面入手,而不会讲具体的实现,具体的实现会在后面其它专题的文章中陆续给你们引出来。app
这篇文章所提的启动都是冷启动。函数
在进行启动优化以前,咱们首先要知道为何要进行启动优化,相信看了下面这组数据,你就会意识到启动优化的重要性:性能
iOS冷启动过程为:从用户点击App图标开始到appDelegate didFinishLaunching方法执行完成为止。这个过程主要分为两个阶段:测试
启动时间(T)= main()函数执行以前的时间(T1)+ main()函数执行以后的时间(T2).
复制代码
dyld里有内置的测量系统,能够经过设置环境变量访问:优化
这段时间咱们能够经过插入代码来测量。网站
CFAbsoluteTime StartTime;
int main(int argc, char * argv[]) {
StartTime = CFAbsoluteTimeGetCurrent();
...
}
复制代码
extern CFAbsoluteTime StartTime;
复制代码
double launchTime = (CFAbsoluteTimeGetCurrent() - StartTime);
复制代码
苹果的经验法则告诉咱们:400ms是一个不错的启动时间。 **注意:**在测量启动时间时,须要在最慢的支持设备上进行测试。spa
先回顾下Dyld的加载步骤: 操作系统
平均每一个应用会包含100到400个dylib,可是系统的dylibs很是快。 加载内嵌的dylib很是昂贵。线程
优化方案:依赖的dylib越少越好。
Rebase因为有许多I/O操做,会慢一些,而Bind在计算上会昂贵一些。其时间都消耗在修复__DATA段里的指针上。
优化方案:减小修复指针的数量
大部分ObjC初始化工做已经在Rebase & Bind阶段完成了,这一步dyld会注册全部声明过的ObjC类,将分类插入到类的方法列表中,再检查每一个selector的惟一性。
优化方案:同Rebase & Bind
这个阶段,dyld开始运行程序的初始化函数,调用每一个Objc类和分类的+load方法,调用C/C++ 中的构造器函数(用attribute((constructor))修饰的函数),和建立非基本类型的C++静态全局变量。
优化方案:
这一阶段要根据具体的业务进行优化,这里不作过多阐述,后面的文章中也会有相关内容,记住指导原则:在知足业务须要的前提下,didFinishLaunchingWithOptions在主线程里作的事情越少越好。