iOS启动优化/耗电优化
一、启动优化
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启动优化/耗电优化相关推荐
- iOS性能优化 - 耗电优化
耗电来源: CPU处理: 网络: 定位: 图像. 如何优化: 1. 尽可能降低CPU.GPU功耗; 2. 少用定时器: 3. 优化I/O操作: 尽量不要频繁写入小数据,最好批量一次性写入: 读写大量重 ...
- iOS 启动优化和安装包瘦身
iOS 启动优化和安装包瘦身 1 启动优化 在iPhone的启动方式中,分为冷启动和热启动两种方式: 1.冷启动(Cold Launch):从零开始启动APP ,需要系统新创建一个进程进行启动,这是一 ...
- iOS启动优化之——如何使用Xcode Log、App Launch、代码来计算启动时间 Launch Time
在iOS启动优化之--如何使用MetricKit 来计算启动时间 Launch Time ,我们提到,可以使用MetricKit 在Organizer中或者直接代码统计,那么还能用什么来统计呢? 配置 ...
- 抖音品质建设 - iOS启动优化《实战篇》
前言 启动是 App 给用户的第一印象,启动越慢,用户流失的概率就越高,良好的启动速度是用户体验不可缺少的一环.启动优化涉及到的知识点非常多,面也很广,一篇文章难以包含全部,所以拆分成两部分:原理和实 ...
- iOS启动优化 —— 二进制重排
iOS启动优化 -- 理论 1. app启动 2. 虚拟内存 & 物理内存 3. 缺页中断(pagefault) 4. 二进制重排 1. app启动 启动的过程一般是指从用户点击app图标开始 ...
- iOS性能优化篇 —— 耗电优化总结
手机App耗电的主要来源有以下四个因素: CPU处理,Processing 网络,Networking 定位,Location 图像,Graphics 耗电优化最终目的:通过尽可能降低CPU.G ...
- 【iOS】Instruments性能检测之耗电优化
耗电优化最终目的:通过尽可能降低CPU.GPU功耗来降低手机电量消耗. (1)尽可能少用定时器: (2)优化I/O操作(所谓的I/O操作也就是文件操作,我们简称为I/O操作.怎么优化呢?尽量不要频繁写 ...
- iOS性能优化06 - 耗电优化
耗电的主要来源 CPU处理,Processing 网络, Networking 定位,Location 图像,Graphics 耗电优化的几条建议 尽可能降低CPU.GPU功耗 少用定时器 优化I/O ...
- Android 性能优化(62)---存检测、卡顿优化、耗电优化、APK瘦身——详解篇
Android 性能优化,内存检测.卡顿优化.耗电优化.APK瘦身--详解篇 自2008年智能时代开始,Android操作系统一路高歌,10年智能机发展之路,如今 Android 9.0 代号P 都 ...
最新文章
- [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
- 广义相对论与量子力学的矛盾
- opencv进阶学习笔记5:图像模糊操作,图像锐化,边缘保留滤波EPF(图像滤镜)
- Unable to execute dex: Multiple dex files define的解决办法
- LINUX装魂斗罗游戏,魂斗罗战甲1-支援形态装置搭配思路及攻略
- python decimal_python学习笔记一
- Python_主成分分析
- hexbin_Power BI Desktop中的Hexbin散点图
- python是什么专业学的-Python开发专业学校排名是什么样的
- 空位補零,你會選擇哪種方式?
- tensorflow学习笔记(4)softmax分类和简单神经网络比较
- c语言课后第七章习题,c语言课后习题第7章函数
- 推挽变换器matlab仿真,双驱动推挽DC-DC变换器方案分享之设计原理简析
- 解决:启动word等office相关软件时,比较慢,会卡在一步Foxit PDF Creator COM Add-in很久
- vue中获取本地内网ip
- 计算机表格怎么加减乘除,怎么在excel表格中计算加减乘除
- epoch如何设置,在Keras中,steps_per_epoch和纪元的设置如何影响训练结果?
- python允许无止境的循环_A-level Computer Science 计算机科学学习笔记/经验分享/教程 (12.6):PHP...
- 服务器断电后找不到磁盘,服务器断电数据丢失恢复原理和恢复过程
- python基础学习-反射
热门文章
- Web 3D全景图(全景漫游)-WebGL/Threejs技术倾心打造
- linux下sd卡修复工具下载,Easeus Data Recovery Wizard
- UE4 4.24像素流送实践 pixel streaming
- matlab 更改jdk版本,程序员怎么修改微信号
- 自我审视记录本_重新审视开源
- “明星产品”爱鸿森的创新之路
- 阿布云、青果网络、亿牛云、熊猫代理,隧道代理推荐哪一家?
- 张兴个人简历计算机,张兴-合肥工业大学电气与自动化工程学院
- 大四毕业生想要找实习程序员工作 ,我总结了三点分享给大家
- 02、文件与用户管理