为什么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的菜单中选择ProductSchemeEdit Scheme...,然后找到 RunEnvironment Variables+,添加name为DYLD_PRINT_STATISTICS值为YSE的环境变量。

在Xcode运行App时,会在console中得到一个报告。例如,我在项目中加入以上设置之后,会得到这样一个报告:

如何解读

  1. main()函数之前总共使用了2.8s

  2. 在2.8s中,加载动态库用了437.31ms,指针重定位使用了1.6s,ObjC类初始化使用了258.48ms,各种初始化使用了491.03ms。

  3. 在初始化耗费的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性能优化 启动相关推荐

  1. iOS性能优化 - 启动优化

    APP的启动可以分为2种 冷启动(Cold Launch):从零开始启动APP: 热启动(Warm Launch):APP已经在内存中,在后台存活着,再次点击图标启动APP. APP启动时间的优化,主 ...

  2. iOS 性能优化-启动优化、main函数之前优化-二进制重排

    一个app的启动时间,很大程度会影响用户的体验,所以能优化还是尽量优化的.之前我们已经探究过dyld加载的流程,启动流程分为main函数之前和main函数之后.这里主要做main函数之前的优化建议. ...

  3. iOS 性能优化总结

    原文链接:https://github.com/skyming/iOS-Performance-Optimization 关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化 ...

  4. iOS性能优化系列篇之“列表流畅度优化”工具篇

    这一篇文章是iOS性能优化系列文章的的第二篇,主要内容是关于列表流畅度的优化.在具体内容的阐述过程中会结合性能优化的总体原则进行分析,所以建议大家在阅读这篇文章前先阅读一下上一篇文章:iOS性能优化系 ...

  5. iOS性能优化 - 耗电优化

    耗电来源: CPU处理: 网络: 定位: 图像. 如何优化: 1. 尽可能降低CPU.GPU功耗; 2. 少用定时器: 3. 优化I/O操作: 尽量不要频繁写入小数据,最好批量一次性写入: 读写大量重 ...

  6. iOS性能优化之耗电量

    iOS性能优化之耗电量 前言 最近在测试App的时候,发现手机特别容易发烫,我们都知道 ,如果手机容易发烫,那么耗电量肯定会相当大,手机电量使用的时间也会相对少:对此,我在工作之余抽了点时间,对手机的 ...

  7. iOS进阶开发-iOS性能优化-关东升-专题视频课程

    iOS进阶开发-iOS性能优化-3316人已学习 课程介绍         介绍了性能优化方法,其中包括内存优化.资源文件优化.延迟加载.持久化优化.使用可重用对象和并发访问等.这些内容都是非常重要的 ...

  8. iOS性能优化:Instruments使用实战

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  9. 转iOS性能优化:Instruments使用实战

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

最新文章

  1. 英特尔展示体育行业与大数据技术应用
  2. 升级到Windows 8.1
  3. 缓冲运动之框架開始一级简单框架实例
  4. 【转】刨根究底字符编码之十——Unicode字符集的字符编码方式
  5. 一步步编写操作系统 2 部署工作环境 2
  6. XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
  7. 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说
  8. android 串口一直打开_串口通讯你真的会了吗?不妨来看看这些经验
  9. go语言的iota是什么意思_go语言基础之iota枚举
  10. MySQL数据库的终结_python中数据库的操作终结
  11. 做运动(Dijkstra+并查集+MST)
  12. 安捷伦or是德信号源+频谱仪操作: 从程控到自动测试 (三)互调检测的程控实现
  13. 电气技术与计算机技术结合,探析计算机与电气自动化技术有机结合.doc
  14. 闽教英语app 破解版 免费版
  15. java libtorrent_[转载]libtorrent安装windows版
  16. 【技术类】2019校招技术类岗位面经汇总
  17. CAD-Cass小结(5)————WIN10安装并运行CAD2006及Cass7.0
  18. C#调用Onnx模型
  19. Open3d数据滤波和点云分割
  20. Android中获取视频的第一帧图片的三种方法

热门文章

  1. MySQL第11天:MySQL索引优化分析之性能分析
  2. C#语言学习思维导图
  3. cortex-M3与ARM7的比较
  4. 简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程。
  5. 解释i节点在文件系统中的作用?超级块作用?
  6. spring14:注解@Autowired,实现引用类型的赋值
  7. TiDB 源码阅读系列文章(十五)Sort Merge Join
  8. sql查询,nolock写还是不写,这是一个问题
  9. RxJava 和 RxAndroid 三(生命周期控制和内存优化)
  10. 将构件发布到私有的nexus maven 仓库