iOS开发系列之性能优化(中)

上篇,本篇主要记录我在程序启动时间优化上的一些探索。html

要谈论时间优化,就要先了解程序启动的过程和耗时的缘由,而后针对性的进行优化。ios

一、程序启动过程

程序的启动分为冷启动和热启动两种模式,其中冷启动是从程序被杀死后加载起来的过程,热启动是从后台到前台的过程。相比之下,热启动是包含在冷启动里,而且比冷启动少了部分加载过程的,因此,咱们日常说的启动优化,通常都是针对冷启动的。git

从点击程序的图标,到首页渲染完成显示到用户眼前,主要有三个阶段。github

1.一、阶段一:main 函数以前

该阶段主要进行动态连接库 (dylib) 和自身 App 可执行文件的加载。性能优化

其中动态连接库包括:iOS 中用到的全部系统 framework,加载 OC runtime 方法的 libobjc,系统级别的 libSystem,例如 libdispatch(GCD) 和 libsystem_blocks (Block)。app

1.二、阶段二:main 函数到首页加载以前

该阶段主要执行 main 函数到 applicationWillFinishLaunching 方法结束。函数

1.三、阶段三:首页开始加载到渲染完成

该阶段主要执行首页界面 viewDidLoad 方法和 UITabBarController 第一个子控制器 viewWillAppear 里的代码。工具

二、耗时产生缘由

2.一、阶段一里可能产生耗时的有:

  • 加载大量动态连接库;post

  • 注册大量Objc类 、初始化类对象 (Objc 的 +load 方法);性能

  • 加载大量分类里的方法;

  • 加载大量 C++ 静态对象;

  • 执行大量声明为 attribute((constructor)) 的C函数。

2.二、阶段二里可能产生耗时的有:

  • 在 applicationWillFinishLaunching 执行了 UITabBarController 以及 子控制器的建立,并在 viewDidLoad 方法里执行了大量的耗时操做;

  • 大量第三方应用的配置和启动项的累积;

2.三、阶段三里可能产生耗时的有:

  • 在 UITabBarController 第一个子控制器的 viewWillAppear 方法里执行了大量的耗时操做;

三、启动时间优化

3.一、针对阶段一的优化:

  • 减小非系统库的依赖、合并不是系统库,苹果最多支持6个非系统的动态库合并为一个;

  • 按期清理项目里不使用的类和方法,检测工具可使用AppCode,关于AppCode的使用请参考这篇文章: AppCode使用介绍

  • 将没必要须在+load方法中作的事情延迟到+initialize中,关于两者的区别能够参考这篇文章

  • 减小分类和分类里方法的数量;

  • 尽可能不要用 C++ 虚函数;

  • 删减一些无用的静态变量。

3.二、针对阶段二的优化:

  • 对启动项和第三方应用配置根据优先级区分,部分不须要在程序启动就初始化的配置,进行延后处理;

  • 减小在viewDidLoad 里的耗时处理;

3.三、针对阶段三的优化:

  • UITabBarController 第一个子控制器里的一些耗时操做能够放到 viewDidAppear 方法中,先把界面加载出来,而后再拿到数据刷新界面;

  • 增长广告页,在这个时间内准备好首屏页面和数据;

四、耗时检测工具

  • Xcode自带的Time Profiler,具体操做能够参考这篇文章

  • 查询main函数以前的耗时:菜单:Product->Scheme->Edit Scheme->Environment Variables,设置:key:DYLD_PRINT_STATISTICS ,value:1。

最后郑重声明,本篇里只是记录一下个人我的理解和代码实践,资料大量参考了如下文章:

今日头条iOS客户端启动速度优化;

iOS App 启动性能优化;

iOS App冷启动治理:来自美团外卖的实践;

iOS app启动速度研究实践;

相关文章
相关标签/搜索