IOS 启动优化

冷启动:官方解释:也就是app不在内存中,从头加载整个应用;
热启动:官方解释:app已经在内存中,即从后台切换到app,这时候app没有被杀掉;

  • 可以通过设置这个属性查看premain启动时间


    IOS 启动优化_第1张图片
    摘自wwdc

启动大概包括两个步骤:

  • 1 mian函数之前的阶段,
  • 2 main

  • main 之前 的加载过程

Load dylibs => Rebase => Binding => ObjC => Initializers

Load dylibs :通常一个 App 需要加载 100 - 400 个 dylibs,但是其中的系统库加载会被优化,能在很快的时间内加载完成;
所以优化 Load dylibs 过程 要减少非系统库的依赖合并非系统库;

  • 尽量不使用内嵌(embedded)的dylib,加载内嵌dylib性能开销较大
  • 合并已有的dylib和使用静态库(static archives),减少dylib的使用个数
  • 懒加载dylib,但是要注意dlopen()可能造成一些问题,且实际上懒加载做的工作会更多
  • 梳理各个类的+load方法,将多个类中+load方法做的事延迟到+initiailize里去做。

Rebase/Bind

  • 减少ObjC类(class)、方法(selector)、分类(category)的数量
  • 减少C++虚函数的的数量(创建虚函数表有开销)
  • 使用Swift structs(内部做了优化,符号数量更少)

Objc setup

大部分ObjC初始化工作已经在Rebase/Bind阶段做完了,这一步dyld会注册所有声明过的ObjC类,将分类插入到类的方法列表里,再检查每个selector的唯一性。

在这一步倒没什么优化可做的,Rebase/Bind阶段优化好了,这一步的耗时也会减少。


Initializers

到了这一阶段,dyld开始运行程序的初始化函数,调用每个Objc类和分类的+load方法,调用C/C++ 中的构造器函数(用attribute((constructor))修饰的函数),和创建非基本类型的C++静态全局变量。Initializers阶段执行完后,dyld开始调用main()函数。

在这一步,我们可以做的优化有:

少在类的+load方法里做事情,尽量把这些事情推迟到+initiailize
减少构造器函数个数,在构造器函数里少做些事情
减少C++静态全局变量的个数


didFinishLaunchingWithOptions 在主线程做的事情一定要少,不必要的拿到子线程去做,或者拿到延迟加载里进行,另外,首页界面绘制最好用纯代码完成,避免加载xib耗费性能和时间;

合并framework,减少framework的数量,如下:

  • 减少分类的使用,尽量把分类合并到一个文件里;
  • 减少selector的使用,因为要检验selector的唯一性,太多了会耗时;

你可能感兴趣的:(IOS 启动优化)