WWDC之优化App启动速度

转载 2016年08月31日 16:46:45

原文链接

前言

title-pic

在WWDC 2016上首次提到了关于App应用启动速度优化的话题:Session 406 Optimizing App Startup Time .该Session上Apple建议一个App完整的启动时间应该保证400ms之内,而若超过20s后还未完全启动App,那么App进程就会被系统杀死.而如何Debug和优化应用启动的时间,官方提出一系列方法来关注应用启动时执行main()前究竟干了些什么.而通过这个Session,你会了解到以下内容:

  • 如何获得应用加载的时间
  • 执行程序入门的代码前App加载过程中的流程
  • 如何优化App的加载时间

测量Pre-main Time

一个App在执行main函数前包括app delegate的系列方法如applicationWillFinishLaunching时,会做许多系统级别的准备.而在iOS10之前,开发者很难清楚自己App为何启动加载慢.而通过在工程的scheme中添加环境变量DYLD_PRINT_STATISTICS,设置Value为1,App启动加载时就会有启动过程的日志输出. 现在(iOS 10之后)Apple对DYLD_PRINT_STATISTICS的日志输出结果进行了简化,使得更容易让开发者理解.

尝试在iPad上对一个纯OC项目设置该环境变量后,有了以下输出信息.

1
2
3
4
5
6
7
8
Total pre-main time:  74.37 milliseconds (100.0%)
       dylib loading time:  41.05 milliseconds (55.2%)
      rebase/binding time:   8.10 milliseconds (10.9%)
          ObjC setup time:   9.87 milliseconds (13.2%)
         initializer time:  15.23 milliseconds (20.4%)
         slowest intializers :
           libSystem.B.dylib :   6.58 milliseconds (8.8%)
 libBacktraceRecording.dylib :   6.27 milliseconds (8.4%)

输出内容展示了系统调用main()函前主要进行的工作内容和时间花费,Session上也对每一阶段加载过程具体内容进行了详细的叙述,有兴趣地可观看该Session.

启动优化

那么如何尽可能的减少pre-main花费的时间呢,主要就从输出日志给出的四个阶段下手:

  • 对动态库加载的时间优化.每个App都进行动态库加载,其中系统级别的动态库占据了绝大数,而针对系统级别的动态库都是经过系统高度优化的,不用担心时间的花费.开发者应该关注于自己集成到App的那些动态库,这也是最能消耗加载时间的地方.对此Apple建议减少在App里开发者的动态库集成或者有可能地将其多个动态库最终集成一个动态库后进行导入, 尽量保证将App现有的非系统级的动态库个数保证在6个以内.

  • 减少Appp的Objective-C类,分类和的唯一Selector的个数.这样做主要是为了加快程序的整个动态链接, 在进行动态库的重定位和绑定(Rebase/binding)过程中减少指针修正的使用,加快程序机器码的生成.

  • 减少Objc运行初始化的时间花费.主要是类的注册,分类的注册,唯一选择器的存在,以及涉及子父类内存布局的Non Fragile ivars偏移的更新,都会影响Objective-C运行时初始化的时间消耗.

  • 使用initialize方法进行必要的初始化工作.用+initialize方法替换调用原先在OC的+load方法中执行初始代码工作,从而加快所有类文件的加载速度.

结尾

最后演讲者对加载启动优化的整体概括了Session所要传达的内容:

  • 使用DYLD_PRINT_STATISTICS测试启动加载时间
  • 减少自定义的动态库集成
  • 精简原有的Objective-C类和代码
  • 移除静态的初始化操作
  • 使用更多的Swift代码

拓展

iOS程序main函数之前发生了什么

【出差外地校招,有位面试的同学是这位博主的粉丝,给我推荐了他的博客】http://blog.sunnyxx.com/2014/08/30/objc-pre-main/ 我是前言 一...

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

本文转载:https://techblog.toutiao.com/2017/01/17/iosspeed/ 应用启动时间,直接影响用户对一款应用的判断和使用体验。头条主app本身就包含非常多并且复...

iOS应用启动速度分析

很多app的开发者都不重视app的启动速度,这对于碎片化使用情景的用户来说,简直是灾难。 iOS应用的启动速度 应用启动时,会播放一个放大的动画。iPhone上是400ms,iPad上是5...

《iOS APP 性能检测》

colawyeeqiu | 导语 最近组里在做性能优化,既然要优化,就首先要有指标来描述性能水平,并且可以检测到这些指标,通过指标值的变化来看优化效果,于是笔者调研了iOS APP性能检测的一些方...

iOS 10适配以及Xcode8兼容问题总结

http://www.cnblogs.com/godlovexq/p/5885212.html 代码注释不能用的解决办法 这个是因为苹果解决xcode ghost,把插件屏蔽了。 解决方法 打...

FMode资料收集

《FMOD快速上手》http://electronic-blue.wikidot.com/doc:fmod-quickstart《音效引擎FMOD》http://www.cppblog.com/wc2...
  • hkx1n
  • hkx1n
  • 2010年10月31日 00:02
  • 1163

iOS线程通信和进程通信的例子(NSMachPort和NSTask,NSPipe)

iOS线程间的通信iOS中,两个线程之间要想互相通信,可以使用:NSMachPort 下面是例子#define kMsg1 100 #define kMsg2 101- (void)viewDidL...
  • yxh265
  • yxh265
  • 2016年05月23日 18:33
  • 5322

NSDictionary实现原理

        NSDictionary(字典)是使用 hash表来实现key和value之间的映射和存储的, hash函数设计的好坏影响着数据的查找访问效率。数据在hash表中分布的越均匀,其访问...

优化 App 的启动速度

App 的启动速度不仅影响我们调试,也直接关系到用户体验。之前有些很久没有打开过的项目,需要花费很长的时间才完成编译;对应的 App 在点击后,许久才出现启动画面。你是否为这些问题苦恼过呢? 这...

性能优化一-app启动速度及splash设计

App启动方式: 1冷启动:启动应用时后台没有该应用的进程,系统会重新创建一个该应用的进程分配与该应用,这种启动方式叫做冷启动  特点:因为系统会重新创建一个进程分配给应用,所以会创建并初始化ap...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WWDC之优化App启动速度
举报原因:
原因补充:

(最多只允许输入30个字)