iOS性能优化 启动
为什么80%的码农都做不了架构师?>>>
App启动过程
解析Info.plist
加载相关信息,例如如闪屏
沙箱建立、权限检查
Mach-O加载
如果是胖二进制文件,寻找合适当前CPU类别的部分
加载所有依赖的Mach-O文件(递归调用Mach-O加载的方法)
定位内部、外部指针引用,例如字符串、函数等
执行声明为
__attribute__((constructor))
的C函数加载类扩展(Category)中的方法
C++静态对象加载、调用ObjC的
+load
函数
程序执行
调用
main()
调用
UIApplicationMain()
调用
applicationWillFinishLaunching
测量冷启动耗时:
冷启动比热启动重要
当用户按下home键的时候,iOS的App并不会马上被kill掉,还会继续存活若干时间。理想情况下,用户点击App的图标再次回来的时候,App几乎不需要做什么,就可以还原到退出前的状态,继续为用户服务。这种持续存活的情况下启动App,我们称为热启动,相对而言冷启动就是App被kill掉以后一切从头开始启动的过程。我们这里只讨论App冷启动的情况。
main()函数之前
在不越狱的情况下,以往很难精确的测量在main()函数之前的启动耗时,因而我们也往往容易忽略掉这部分数据。小型App确实不需要太过关注这部分。但如果是大型App(自定义的动态库超过50个、或编译结果二进制文件超过30MB),这部分耗时将会变得突出。所幸,苹果已经在Xcode中加入这部分的支持。
苹果提供的方法
在Xcode的菜单中选择
Product
→Scheme
→Edit Scheme...
,然后找到Run
→Environment Variables
→+
,添加name为DYLD_PRINT_STATISTICS
值为YSE
的环境变量。
在Xcode运行App时,会在console中得到一个报告。例如,我在项目中加入以上设置之后,会得到这样一个报告:
如何解读
main()函数之前总共使用了2.8s
在2.8s中,加载动态库用了437.31ms,指针重定位使用了1.6s,ObjC类初始化使用了258.48ms,各种初始化使用了491.03ms。
在初始化耗费的491.03ms中,用时最多的三个初始化是libSystem.B.dylib、libMainThreadChecker.dylib、MediaServices。
多次启动一般越来速度越快,模拟器。。。。时间就像我这个一样,,,,,,,,,,,,,很长
main()函数之后
从main()
函数开始至applicationWillFinishLaunching
结束,我们统一称为main()函数之后的部分。
这部分可以这么测试在main函数中我们加入如下代码:
CFAbsoluteTime startTime;
int main(int argc, char * argv[]) {@autoreleasepool {startTime = CFAbsoluteTimeGetCurrent();return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}
}
在appdelegate中我们在didfinish中加入
extern CFAbsoluteTime startTime;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {NSLog(@"starttime %f",CFAbsoluteTimeGetCurrent() - startTime);return YES;
}
这样就会得到这段的时间。
优化部分:
main()函数之前耗时的影响因素
动态库加载越多,启动越慢。
ObjC类越多,启动越慢
C的constructor函数越多,启动越慢
C++静态对象越多,启动越慢
ObjC的+load越多,启动越慢
main()函数之后耗时的影响因素
执行main()函数的耗时
执行applicationWillFinishLaunching的耗时
rootViewController及其childViewController的加载、view及其subviews的加载applicationWillFinishLaunching的耗时
优化部分
1. 移除不需要用到的动态库
2. 移除不需要用到的类
3. 合并功能类似的类和扩展(Category)
4. 压缩资源图片
5. 优化applicationWillFinishLaunching
6. 优化rootViewController加载
--尽量避免过多使用+load
方法,可以使用+initlalize
替代
在系统第一次使用到这个类的使用,才会使用到他的+(void)initlalize
方法
--减少- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
里面的操作,在启动页出现后再进行相关操作.(例如放到子线程中去执行)
关于每个objc文件的+load函数的执行循序
- 每个objc文件都有
+load
方法,此处的文件顺序,决定了+load
的执行顺序
作者:找不到工作的iOS
链接:https://www.jianshu.com/p/d4b9fa8f2585
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
更多可以参考:
https://mp.weixin.qq.com/s/Kf3EbDIUuf0aWVT-UCEmbA
https://github.com/skyming/iOS-Performance-Optimization
转载于:https://my.oschina.net/rainwz/blog/1818816
iOS性能优化 启动相关推荐
- iOS性能优化 - 启动优化
APP的启动可以分为2种 冷启动(Cold Launch):从零开始启动APP: 热启动(Warm Launch):APP已经在内存中,在后台存活着,再次点击图标启动APP. APP启动时间的优化,主 ...
- iOS 性能优化-启动优化、main函数之前优化-二进制重排
一个app的启动时间,很大程度会影响用户的体验,所以能优化还是尽量优化的.之前我们已经探究过dyld加载的流程,启动流程分为main函数之前和main函数之后.这里主要做main函数之前的优化建议. ...
- iOS 性能优化总结
原文链接:https://github.com/skyming/iOS-Performance-Optimization 关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化 ...
- iOS性能优化系列篇之“列表流畅度优化”工具篇
这一篇文章是iOS性能优化系列文章的的第二篇,主要内容是关于列表流畅度的优化.在具体内容的阐述过程中会结合性能优化的总体原则进行分析,所以建议大家在阅读这篇文章前先阅读一下上一篇文章:iOS性能优化系 ...
- iOS性能优化 - 耗电优化
耗电来源: CPU处理: 网络: 定位: 图像. 如何优化: 1. 尽可能降低CPU.GPU功耗; 2. 少用定时器: 3. 优化I/O操作: 尽量不要频繁写入小数据,最好批量一次性写入: 读写大量重 ...
- iOS性能优化之耗电量
iOS性能优化之耗电量 前言 最近在测试App的时候,发现手机特别容易发烫,我们都知道 ,如果手机容易发烫,那么耗电量肯定会相当大,手机电量使用的时间也会相对少:对此,我在工作之余抽了点时间,对手机的 ...
- iOS进阶开发-iOS性能优化-关东升-专题视频课程
iOS进阶开发-iOS性能优化-3316人已学习 课程介绍 介绍了性能优化方法,其中包括内存优化.资源文件优化.延迟加载.持久化优化.使用可重用对象和并发访问等.这些内容都是非常重要的 ...
- iOS性能优化:Instruments使用实战
最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...
- 转iOS性能优化:Instruments使用实战
最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...
最新文章
- 英特尔展示体育行业与大数据技术应用
- 升级到Windows 8.1
- 缓冲运动之框架開始一级简单框架实例
- 【转】刨根究底字符编码之十——Unicode字符集的字符编码方式
- 一步步编写操作系统 2 部署工作环境 2
- XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
- 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说
- android 串口一直打开_串口通讯你真的会了吗?不妨来看看这些经验
- go语言的iota是什么意思_go语言基础之iota枚举
- MySQL数据库的终结_python中数据库的操作终结
- 做运动(Dijkstra+并查集+MST)
- 安捷伦or是德信号源+频谱仪操作: 从程控到自动测试 (三)互调检测的程控实现
- 电气技术与计算机技术结合,探析计算机与电气自动化技术有机结合.doc
- 闽教英语app 破解版 免费版
- java libtorrent_[转载]libtorrent安装windows版
- 【技术类】2019校招技术类岗位面经汇总
- CAD-Cass小结(5)————WIN10安装并运行CAD2006及Cass7.0
- C#调用Onnx模型
- Open3d数据滤波和点云分割
- Android中获取视频的第一帧图片的三种方法