WWDC之优化App启动速度
来源:互联网 发布:邳州网络直通车 编辑:程序博客网 时间:2024/06/05 16:02
原文链接
前言
在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项目设置该环境变量后,有了以下输出信息.
12345678
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代码
拓展
- WWDC 2016 Session 406 Optimizing App Startup Time
- Objective-C Runtime
- WWDC之优化App启动速度
- App启动速度优化
- App启动速度优化
- App优化之提升你的App启动速度
- Android App优化之提升你的App启动速度
- 优化 App 的启动速度
- iOS APP启动速度优化
- Android开机启动速度优化 && app启动速度优化
- Android性能优化第(九)篇---App启动速度优化之启动页设计
- App优化之提升你的App启动速度之理论基础
- App优化之提升你的App启动速度之实例挑战
- Android App优化之提升你的App启动速度之实例挑战
- Android App优化之提升你的App启动速度之理论基础
- Android App优化之提升你的App启动速度之实例挑战
- App优化之提升你的App启动速度之实例挑战
- App优化之提升你的App启动速度之实例挑战
- Android App优化之提升你的App启动速度之理论基础
- Android App优化之提升你的App启动速度之实例挑战
- Android Studio使用Material主题样式
- C语言学习 ,一个球从100米的高度自由落下,每次落地后反弹回到原高度的一半,再落下,再反弹,求它在第一次落地时,共经过多少米,第10次反弹多高
- 初识cocos2d-x
- Android MPAndroidChart使用教程和源码分析(二)
- 解决sqlite3插入数据很慢的问题
- WWDC之优化App启动速度
- 待转移
- Android通用的EmptyLayout-展示不用状态的界面
- jquery ajax 同步异步的执行
- 曲线平滑-B样条曲线
- Codeforces 388B Fox and Minimal path(构造)
- 数据库理论(2)之数据库事务
- 界面对应字段,绑定数据到gridview 显示 及删除功能 窗体事件 分页及键
- 子类,父类默认构造函数及带参构造函数的调用