一、启动优化

1.pre-main阶段

我们可以通过苹果提供了XCode内建的测量方法,

  • 1.点击项目名称
  • 2.Edit scheme...
  • 3.左侧Run
  • 4.中间顶部菜单Auguments
  • 5.在Environment Variables中添加一个环境变量DYLD_PRINT_STATISTICS,并设为 1

再次运行项目,会得到以下输出

主要分为3个加载阶段

  • 1.加载应用的可执行文件(app自身的所有.o文件集合)
  • 2.加载动态链接器dyld(dynamic loader一个专门用来加载动态链接库的库)
  • 3.dyld递归加载应用所有需要的动态链接库

优化:
Apple官方视频讲解 https://developer.apple.com/videos/play/wwdc2016/406/

1.Load dylibs


一般iOS应用会加载100-400个dylibs,这些库都是系统的,并且Apple也做了很多的优化。

这一阶段主要就是分析应用以来的dylib(现在名为.tbd),找到其mach-o文件,然后验证其有效性,接着注册到内核,最后对dylib的每一个segment调用nmap()

2.Rebase/Bind

在dylib的加载过程中,系统为了安全考虑,引入了ASLR(Address Space Layout Randomization)技术和代码签名。由于ASLR的存在,镜像(Image,包括可执行文件、dylib和bundle)会在随机的地址上加载,和之前指针指向的地址(preferred_address)会有一个偏差(slide),dyld需要修正这个偏差,来指向正确的地址。

Rebase在前,Bind在后,Rebase做的是将镜像读入内存,修正镜像内部的指针,性能消耗主要在IO。Bind做的是查询符号表,设置指向镜像外部的指针,性能消耗主要在CPU计算。

我们在这一步可以做的优化有:

  • 1.减少ObjC类(class)、方法(selector)、分类(category)的数量
  • 2.减少C++虚函数的的数量(创建虚函数表有开销)
  • 3.使用Swift structs(内部做了优化,符号数量更少)
3.ObjC Setup


大部分ObjC初始化工作已经在Rebase/Bind阶段做完了,这一步dyld会注册所有声明过的ObjC类,将分类插入到类的方法列表里,再检查每个selector的唯一性。

在这一步倒没什么优化可做的,Rebase/Bind阶段优化好了,这一步的耗时也会减少。

4.Initializers

到了这一阶段,dyld开始运行程序的初始化函数,调用每个Objc类和分类的+load方法,调用C/C++ 中的构造器函数(用attribute((constructor))修饰的函数),和创建非基本类型的C++静态全局变量(通常是类或结构体)。Initializers阶段执行完后,dyld开始调用main()函数。

Objc的load函数和C++的静态构造函数采用由底向上的方式执行,来保证每个执行的方法,都可以找到所依赖的动态库。例:

我们在这一步可以做的优化有:

  • 1.少在类的+load方法里做事情,尽量把这些事情推迟到+initiailize
  • 2.减少构造器函数的个数,在构造器函数里少做些事情
  • 3.减少C++静态全局变量的个数

2.main阶段

主要分为4个加载阶段

  • 1.dyld调用main()函数
  • 2.调用UIApplicationMain函数
  • 3.调用applicationDidFinishLaunching方法
  • 4.调用didFinishLaunchingWithOptions方法

那么这些是我们可以通过代码来优化的地方,比如在一开始,不要初始化那么多的SDK或者功能,是否考虑一些初始化可以在子线程操作等

我们可以通过main阶段耗时加载多久
1.先在main函数这里设置当前时间

CFAbsoluteTime StartTime;
int main(int argc, char * argv[]) {StartTime = CFAbsoluteTimeGetCurrent();
......

2.再在AppDelegate.m文件中用extern声明全局变量StartTime

extern CFAbsoluteTime StartTime;

3.最后在didFinishLaunchingWithOptions里,再获取一下当前时间,与StartTime的差值即是main()阶段运行耗时。

double launchTime = (CFAbsoluteTimeGetCurrent() - StartTime);
NSLog(@"耗时 launchTime = %lf 秒", launchTime);

二、耗电优化

主要集中在

  • 1.网络 Network
  • 2.定位
  • 3.蓝牙
  • 4.app前后台
  • 5.CPU计算
  • 6.GPU渲染

1.定位功能

  • app推到后台时,非导航功能之外,可以暂停定位功能,比如:把pauseLocationUpdatesAutomatically = YES;
  • 设置定位的精度越高,定位硬件模块功耗越大,如果不是要求特别精准的功能,可以把定位精度降低
  • 按需使用定位,不用的时候关闭它

2.网络请求

  • app推到后台时,尽量减少网络请求,不是必要的请求,可以等用户切换到前台时再去请求
  • app退到后台时,大部分的时候,刷新UI的操作是不必要的

其他

  • 刷新UITableView或者UICollectionView的时候,尽量做到刷新一行,或者刷新一个section
  • 像对UIView的圆角、阴影等效果能用图片图标做到的,一律不用代码写
  • 网络请求的数据如果需要的话,尽量做本地缓存
  • 蓝牙按需使用,不用的时候关闭它
  • 定时器Timer的使用频次减少
  • 大文件I/O操作时,可以用dispatch_io

比如:滴滴这种app,很多时候希望在1%的电量时,还能打个车,这个时候,我们要尽量把除了发布打车订单的请求保留,其他的数据请求应该暂时禁用。

iOS启动优化/耗电优化相关推荐

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

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

  2. iOS 启动优化和安装包瘦身

    iOS 启动优化和安装包瘦身 1 启动优化 在iPhone的启动方式中,分为冷启动和热启动两种方式: 1.冷启动(Cold Launch):从零开始启动APP ,需要系统新创建一个进程进行启动,这是一 ...

  3. iOS启动优化之——如何使用Xcode Log、App Launch、代码来计算启动时间 Launch Time

    在iOS启动优化之--如何使用MetricKit 来计算启动时间 Launch Time ,我们提到,可以使用MetricKit 在Organizer中或者直接代码统计,那么还能用什么来统计呢? 配置 ...

  4. 抖音品质建设 - iOS启动优化《实战篇》

    前言 启动是 App 给用户的第一印象,启动越慢,用户流失的概率就越高,良好的启动速度是用户体验不可缺少的一环.启动优化涉及到的知识点非常多,面也很广,一篇文章难以包含全部,所以拆分成两部分:原理和实 ...

  5. iOS启动优化 —— 二进制重排

    iOS启动优化 -- 理论 1. app启动 2. 虚拟内存 & 物理内存 3. 缺页中断(pagefault) 4. 二进制重排 1. app启动 启动的过程一般是指从用户点击app图标开始 ...

  6. iOS性能优化篇 —— 耗电优化总结

       手机App耗电的主要来源有以下四个因素: CPU处理,Processing 网络,Networking 定位,Location 图像,Graphics 耗电优化最终目的:通过尽可能降低CPU.G ...

  7. 【iOS】Instruments性能检测之耗电优化

    耗电优化最终目的:通过尽可能降低CPU.GPU功耗来降低手机电量消耗. (1)尽可能少用定时器: (2)优化I/O操作(所谓的I/O操作也就是文件操作,我们简称为I/O操作.怎么优化呢?尽量不要频繁写 ...

  8. iOS性能优化06 - 耗电优化

    耗电的主要来源 CPU处理,Processing 网络, Networking 定位,Location 图像,Graphics 耗电优化的几条建议 尽可能降低CPU.GPU功耗 少用定时器 优化I/O ...

  9. Android 性能优化(62)---存检测、卡顿优化、耗电优化、APK瘦身——详解篇

    Android 性能优化,内存检测.卡顿优化.耗电优化.APK瘦身--详解篇 自2008年智能时代开始,Android操作系统一路高歌,10年智能机发展之路,如今 Android 9.0 代号P  都 ...

最新文章

  1. [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
  2. 广义相对论与量子力学的矛盾
  3. opencv进阶学习笔记5:图像模糊操作,图像锐化,边缘保留滤波EPF(图像滤镜)
  4. Unable to execute dex: Multiple dex files define的解决办法
  5. LINUX装魂斗罗游戏,魂斗罗战甲1-支援形态装置搭配思路及攻略
  6. python decimal_python学习笔记一
  7. Python_主成分分析
  8. hexbin_Power BI Desktop中的Hexbin散点图
  9. python是什么专业学的-Python开发专业学校排名是什么样的
  10. 空位補零,你會選擇哪種方式?
  11. tensorflow学习笔记(4)softmax分类和简单神经网络比较
  12. c语言课后第七章习题,c语言课后习题第7章函数
  13. 推挽变换器matlab仿真,双驱动推挽DC-DC变换器方案分享之设计原理简析
  14. 解决:启动word等office相关软件时,比较慢,会卡在一步Foxit PDF Creator COM Add-in很久
  15. vue中获取本地内网ip
  16. 计算机表格怎么加减乘除,怎么在excel表格中计算加减乘除
  17. epoch如何设置,在Keras中,steps_per_epoch和纪元的设置如何影响训练结果?
  18. python允许无止境的循环_A-level Computer Science 计算机科学学习笔记/经验分享/教程 (12.6):PHP...
  19. 服务器断电后找不到磁盘,服务器断电数据丢失恢复原理和恢复过程
  20. python基础学习-反射

热门文章

  1. Web 3D全景图(全景漫游)-WebGL/Threejs技术倾心打造
  2. linux下sd卡修复工具下载,Easeus Data Recovery Wizard
  3. UE4 4.24像素流送实践 pixel streaming
  4. matlab 更改jdk版本,程序员怎么修改微信号
  5. 自我审视记录本_重新审视开源
  6. “明星产品”爱鸿森的创新之路
  7. 阿布云、青果网络、亿牛云、熊猫代理,隧道代理推荐哪一家?
  8. 张兴个人简历计算机,张兴-合肥工业大学电气与自动化工程学院
  9. 大四毕业生想要找实习程序员工作 ,我总结了三点分享给大家
  10. 02、文件与用户管理