iOS性能(二) 启动时间优化

2019-05-27  本文已影响0人  枫林风雨
冷启动 与 热启动
查看启动时间

配置Xcode环境变量在日志中打印启动时间:
打开工程 -> Edit Scheme -> Run -> Environment Variables
根据需要添加DYLD_PRINT_STATISTICSDYLD_PRINT_STATISTICS_DETAILS环境变量,1表示Yes,开启这个功能。

屏幕快照 2019-05-27 下午3.13.41.png
Total pre-main time: 433.19 milliseconds (100.0%)
         dylib loading time: 341.79 milliseconds (78.8%)
        rebase/binding time:  14.18 milliseconds (3.2%)
            ObjC setup time:  35.27 milliseconds (8.1%)
           initializer time:  41.79 milliseconds (9.6%)
           slowest intializers :
             libSystem.B.dylib :   3.40 milliseconds (0.7%)
    libMainThreadChecker.dylib :  19.68 milliseconds (4.5%)
  libViewDebuggerSupport.dylib :   8.75 milliseconds (2.0%)
优化启动

以main函数作为分水岭,启动时间其实包括了两部分:main函数之前和main函数到第一个界面的viewDidAppear:。
所以,优化也是从两个方面进行的,优化效果主要来自于后者,因为绝大多数App的瓶颈在自己的代码里。而对于pre-main的优化能做的无非是减少不必要的动态库引用、多个库合并成一个,从上面的打印数据也可以看出,主要耗时是在dylib loading,消耗78.8%的时间。

Main函数之后

从main函数开始执行,到第一个界面显示,期间一般做以下任务:

优化:

  1. 延迟初始化和加载不必要的UIViewController和View。

比方说UITabViewController有四个Item,在启动的时候尽量只初始化首页的页面,其它Item页面先用空VC占位。而且首页的内容中不必要的内容也可以先不初始化,做成懒加载形式,在用户确实需要查看和使用时再初始化。

  1. 对于确实需要启动时使用但又比较耗时的事物放倒后台处理,如果涉及到UI则在处理完成后把刷新任务放回主线程。

日志功能,日志往往涉及到DB操作;
文件读取,比如读取本地存储的省份城市区县文件和图片处理;
大量的计算,比如图片处理、比较大的json数据转Model;

  1. 能延迟初始化的尽量延迟初始化

三方SDK初始化,比如Crash统计、 像分享之类的,可以等到第一次调用再出初始化。

Main函数之前

Main函数之前是iOS系统的工作,所以这部分的优化往往更具有通用性。
Pre-Main包含以下工作:

- dylib loading time: 341.79 milliseconds (78.8%)
- rebase/binding time:  14.18 milliseconds (3.2%)
- ObjC setup time:  35.27 milliseconds (8.1%)
- initializer time:  41.79 milliseconds (9.6%)
- slowest intializers :
- libSystem.B.dylib :   3.40 milliseconds (0.7%)
- libMainThreadChecker.dylib :  19.68 milliseconds (4.5%)
- libViewDebuggerSupport.dylib :   8.75 milliseconds (2.0%)

优化:

  1. loading dylib:启动的第一步是加载动态库,加载系统的动态库使很快的,因为可以缓存,而加载内嵌的动态库速度较慢。所以,提高这一步的效率的关键是:减少动态库的数量。
  1. rebase/binding & ObjC Runtime setup:Rebase和Binding都是为了解决指针引用的问题。对于Objective C开发来说,主要的时间消耗在Class/Method的符号加载上,所以常见的优化方案是:
  1. Initializers

参考资料

深入理解iOS App的启动过程

上一篇 下一篇

猜你喜欢

热点阅读