简介
这篇文章文章主要介绍iOS性能优化方面的信息,主要从四个方面进行:应用启动时间;页面刷新滚动流畅度;耗电量;安装包的大小
- 应用启动时间
- 页面刷新滚动流畅度
- 耗电量
- 安装包的大小
1 应用启动线程池时间
这里的应用启动时间指,应用启动到显示第一个页面展示时的时间。
应用启动有冷启动和热启动,热启动是指应用在后台活着,然后再启动应用。这里只谈冷启动。
启动时间在小于400ms是最佳的,因为从点击图标到显示Launch Screen,到Launch Screen消失这段时间是400ms。启动时间不可以github大于20s,google否则会被系统杀掉。
先缓存视频在手机哪里找来看看Xcode9新加的神器,通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> R龚俊un -> Arguments),DYLD_PRINT_STATISTICS设置为1,如果查看更详细的信息可以DYLD_PRINT_STATISTICS_DETAILS设置为1。
然后启动应用,即可查看到以下信息
Total pre-main time: 588.23 milliseconds (100.0%)
dylib loading time: 264.36 milliseconds (44.9%)
rebase/binding time: 56.19 milliseconds (9.5%)
ObjC setup time: 49.84 milliseconds (8.4%)
initializer time: 217.71 milliseconds (37.0%)
slowest intializers :
libSystem.B.dylib : 9.18 milliseconds (1.5%)
libMainThreadChecker.dylib : 36.42 milliseconds (6.1%)
libglInterpose.dylib : 82.35 milliseconds (14.0%)
libMTLInterpose.dylib : 32.51 milliseconds (5.5%)
MeeYi : 24.89 milliseconds (4.2%)
可以看到,github永久回家地址在执行main函数前,应用准备了执行了4工作总结个流程:github中文官网网页d工龄差一年工资差多少ylib loading、rebase/bindin宫颈癌g、ObjC setup、initi宫颈癌alizer,github下面我们将好好分析这几个流程。
- load dylibs:加载动态库,包括系统的、自己添加的(第三方缓存的),递归一层一层加载所依赖的库。
- Rebase&amgithub永久回家地址p;Bind:修复指针,mach-o内部的存储逻辑是,信息的存储地址是虚拟内存,不是直接对应物理内存;每一次应用启动的时候,内存的开始地址又是随机的,Objective-C因此需要对接虚拟内存和物理内存地址。为了安全,防止黑客攻击。
- Objc:giti轮胎注册类信息到全局Table中
-
Initializers:初始化部分,+load方法初始化,C/C++静态初始化对象和标记
__att线程数ribute__(constructor)
的方法
- Main() :执行mai缓存视频在手机哪里找n函数,执行APPDelegGitate的方法
-
加载Window+加载RootVi缓存清理ewController+初始化操作:主要在
didgiti轮胎FinishLaunchingWithOptions
执行操作,比线程安全如初始化第三方库,初始化基础信息,加载RootViewControlle线程的几种状态r等
在了解了应用启动流程后,那对应用线程池的七个参数启动优化的工作就细分到了对每个流程的优化上。
1.1 main()函数之前:
1.1.1 dylibs:加载动态库
启动的第一步是加载动态库,加载系统的动态库使很快的,因为可以缓存,而加载内嵌的动态库速度较慢。
所以,提高这一步的效率的关键是:减少动态库的数量。合并动态库。
比如公司内宫颈癌部由私有Pod建立了如下动态库:XXTableV宫颈癌iew, XXHUD, XXLabel,强烈建议合并github永久回家地址成一个XXUIKit来提高加载速度。
1.1.2 Rebase &gitee; Bind & Objective C Runtime
Rebase和Bind都是缓存清理为了解决指针引用的问题。对于Objective C开发来说,主要的时间消耗在Class/M龚俊ethod的符gitlab号加载上,所以常见的优化方案是:
1)减少__D工作总结ATA段中的指针数github永久回家地址量。
2)合并Category和功能类似的类。比如:UIView+Framgiti轮胎e,UIView线程是什么意思+AutoLGitayout…合并为一个
删除无用的方法和类。
3)多用Swift Structs,因为Swfit Structs是静态分发的。
1.1.3 Ingithub开放私库itializers
通常,我们会在+load方法中进行method-swizzling,但这会影响应用启动的时间。
1)用initiali线程的概念ze替代load。不少同学喜欢用method-swizzling来实现AOP去做日志统计等内容,强烈建议改为在initia工商银行lize进行初始化。
2)减少atribute((constructor)工商银行)的使用,而是在第一次访问的时候才用dispatch_once等方式初始化。
3)不要创建线公积金程
4)使用Swfit重写代码。
1.2 main()函数之后:
优化的核心思想:能延迟初始化的尽量延迟初始化,不能延迟初始化的尽量放到后台初始化。
我们首先来分析下,从main函数开始执行,到你的第一个界github面显示,这期间一般会做哪些事供品夫人情。
- 执行缓存AppDelegate的代理方法,主要是didFinishLaunchingWithOptions缓存文件夹名称,applicationDidBecomeActive,
- 初始化第三方skd
- 初始化Window,初始化基础的ViewController
- 获取数据(Local DB/Nobjectivec是c语言吗etwork),展示给用户缓存视频变成本地视频。
在这个过程中我们可以借助工具来进行检测
- 知道这个过程后,可以借助Time Profiler工具查找具体的耗时模块,几点要注意:
-
- 分析启动时间,一般只关心主线程
- 选择Hide System Libraries和Invert Call Tree,这样我们能专注于自己的代码
-
- 右侧可以看到详细的调用堆栈信息
-
另外,也可以借用C语言函数查看模块运行时间:
CFTimeInterval startTime = CACurrentMediaTime();
//执行方法
CFTimeInterval endTime = CACurrentMediaTime();
当检测出耗时的模线程和进程的区别是什么块时,就可以按照优化的核心思想来进行处理了。即:
能延迟初始化的尽量延迟初始化,不能公积金延迟初始化的尽量放到后台初始化。
2 页面刷新滚动流畅度
在优化流程度前需要先了解下iOS页面的成像过程。
2.1 CPU(Central Processing Unit,中央处理器):
对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制(Core Graphics)
2.2 GPU(GraphicsObjective-C Processing Unit,图形处理器):
纹理的渲染
2.3 成像过程:
CPU计算信息,GPU渲染信息到帧缓存区(iOS是双缓存工龄差一年工资差多少机制,有前帧缓存、后帧缓存),视频控制苟在神诡世界器从帧缓存中读取信息显示到屏幕上。
2.4 造成卡顿的原因:
按照60FPS的刷帧率,每隔16ms就会有一次VSync信号,VSync信号来的时候就需要从帧缓存区中取缓存显示到屏幕上,如果每次VSync信号来的时候CPU和GPU没有处理好信息渲染到缓存区,那么就会从缓存中拿之前缓存的显示线程安全,就造成了丢帧,丢帧多了就会造成卡顿。
2.5 检测卡顿
平时所说的“卡顿”主要是因为在工作总结主线程执行了比较耗时的操作,这里检测的有两个方案:
- Instruments中的coreAnimation工具宫颈癌,查看刷帧率,最理想最高的是60fps
- 可以添加Observer到主线程RunLoop中,通过监听RunLoop状态切换的耗时,以达到监控卡顿的目的
这个可以借助第三方框架(github上很多),如:LXDAppFluecyMonitor、JPFPSStatus
2.6 解决卡顿
尽可能减少CPU、GPU资源消耗
2.6.1 优化
- 优化CPU
-
- 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALgiteeayer取代UIView
- 不要频繁地调用UIView的相关属性,比如frame、bounds、transform等属性,宫颈癌尽量减少不必要的修改
-
- 尽缓存量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性
- Autolayout会比直接设置frame消耗更多的CPU资源
-
- 图片的size最好刚objective-c和swift好跟缓存清理UIImageView的size保持一致
- 控制一下线程的最大并发数量
-
- 尽量把耗时的操作放到子线程:如文本处理(尺寸计算、绘缓存的视频怎么保存到本地制);图片处理(解码、工商银行绘制)
-
优化GPU
-
- 尽量避github中文官网网页免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
- 尽量减少视图线程的概念数量和层次
-
- 减少透明的视github永久回家地址图(alpha<1),不透明的就设置opaque为YES
- 尽量避免出现离屏渲染
-
避免离屏渲染缓存清理
在OpenGL中,GPU有2种渲染方式:
-
- On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区公积金进行渲染操作;
- Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
-
- 离屏渲染消耗性能的原因
-
-
- 需要创建新的缓冲区
- 离屏渲染的整个过程,缓存文件夹名称需要多次切换上下文环境,github是干什么的先是从github中文官网网页当前屏幕(On-Scregitlaben)切换到离公积金屏(Off-Screen);等到离屏渲染结束giti轮胎以后,将苟在神诡世界离屏缓冲工作总结区的渲染结果显示到屏幕上,又需要将上下文环境从离缓存视频怎样转入相册屏切github永久回家地址换到当前屏幕
-
-
- 会造成离屏渲染的有:Go
-
-
- 光栅化,layer.shouldRasterize = YES
- 遮罩,layer.mask
-
-
-
- 圆角,同时设工龄差一年工资差多少置layer.masksToBounds = YES、layer.cogiti轮胎rnerRadius大于(考虑通过Core线程的几种状态Graphics缓存视频合并绘制裁剪圆角,或者叫美工提供圆角图github是干什么的片)
- 阴影,lagithub开放私库yer.shadowXXX,如果设置了layer.shadowPath就不会产生离屏渲染
-
3 耗电量
3.1 应用耗电的宫颈癌主要来源有:
- CPUgitee处理,Processing
- 网络,Netw缓存的视频怎么保存到本地orking
- 定位,Location
- 图像,GraGitphics
3.2 耗电优化:
- 尽可能缓存降低CPU、GPU功耗
- 少用定时器
- 优化I/Ogit命令操作
-
- 尽量不要频繁写Git入小数据,最好批量一次性写入
-
- 读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异github永久回家地址步操作文件I/O的API。用dispatch_io系统会优化磁盘访问
-
- 数据量比较大的,建议使用数据库(比如SQLite、CoreData)
- 网络优化
-
- 减少、压缩网络数据
-
- 如果多次请求的结果是相同的,尽量使用缓存
-
- 使用断点续传,否则网络不稳定时可能多次传输相同的内容
-
- 网络不可用时,不要尝试github开放私库执行网络请求
-
- 让用户可以取消长时间运行或者速度很慢的网络操作,设置合适的超时时间
-
- 批线程撕裂者量传输线程的几种状态,比如,下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块地下载。如果下载广告,一次性多下载一些,然后再慢慢展示。如果下载电子邮件,一次下载多封,不要一封一封地下载
- 定位优化
-
- 如果只是需要快速工商银行确定用户位置,最好用缓存清理CLLocationManager的req工作总结uestLogithub永久回家地址cation方法。定位完成后,会自动让定位硬件断电
-
- 如果不是github导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
-
- 尽量降低定位精度,比如尽量不要使用google精度最高的kCLLocationAccuracyBest
-
- 需要后台定位时,尽量缓存文件夹名称设置pauses线程和进程的区别是什么Locati缓存视频怎样转入相册onUpdatesAutomatically为YES,如果用户不太可能移动的时候系统会自动暂停位置更新
-
- 尽量不要使用sta线程安全rtMonitoringS线程和进程的区别是什么ignificantLocationChanges,优先考虑startMonitoringForRegion:
- 硬件检测优化
-
- 用户移动、摇晃、倾斜设备时objective-c和swift,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件
4 安装包瘦身
安装包(IPA)主要由可执行文件、资源组成,因此对于iOS安装包的瘦身也将从这两个方面进行
4.1 资源(图片、音频、视频等)
- 采取无损压缩
- 去除没有用到的资源
4.2 可执行文件瘦身
- 编译器优化
-
- Strip Linked Product、Make Strings Read-Only、Symbols Hidden by Default设置为YES
-
- 去掉异常支持,Enable C++ Exceptions、Enable Objective-C Exceptions设置为NO, Other C Flags添加-fno-except缓存视频怎样转入本地视频ions
- 利用AppCode(www.jetbrains.com/objc/)检测未使用的代码:菜单栏 -> Code -> Ins缓存pect Code
- 编写LLVM插件检测出重复代码、线程数未被调用的代线程数越多越好吗码
- 生线程的几种状态成LinkMap文件,可以查看可执行文件的具体组成,哪些giti文件偏大
-
- 可借助第三方工具解析LinkMap文件:github.com/huanxsd/Lin…供品夫人
4.3 bitcode
xcode7之后多了这样的一个设置,默认是打开的。打开bitcodobjective-c和swifte设置后,编译出来的包不是最终供品夫人的二进制包而是bitcode中间码,Apple会根据编译器、应用设备来优化bitcode来给你最终最工龄差一年工资差多少最优化的二进制应用包。这样避免了苹果更新了编译器或硬件设备时在提交app包到appstore的问题。同时也享受到了编译器改进带来的好处。工商银行
但是有个坑的地方,有些第三方库并不支持bitcode,如果要使用对应的第三方库就得关闭这个bitcode。由于时间太久,已经忘了当时是哪些第三方库不支持了,不知道现缓存视频变成本地视频在有没有支持。
5 其他:
- Facebook 和 Pinte供品夫人rest 维护的 ASDK 可对视图的渲染进行优化,具体可参考这篇博客
- 网络请求优化:
-
- 网络请求数据缓存:针对于时效性比较长的可以做缓存,在请求的时候在有效期内直接获取此信息
-
- 网络请求次数优化:请求开始、取消、回调之前做限制——-AOgitiP面向切片编程
2.6 解决Go卡顿
尽可能减少CPUgiti、GPU线程数越多越好吗资源消耗
2.6.1 优化
- 优化CPU
-
- 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CALayer取代UIView
- 不要频繁地调用UIView的相关属性,比如frame、bounds、transform等属性,尽量减少不必要的修改
-
- 尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性
- Autolayout会比直接设置frame消Go耗更多的CPU资源
-
- 图片的size最好刚好跟UIImageView的siObjective-Cze保持一致
- 控制一下线程的最大并发数量
-
- 尽量把耗时的操作放到子线程:如文本处理(尺寸计算、绘制);图片处理(解码、绘制)
-
优化GPU
-
- 尽量避免短时间内大量图片的显示,尽可能将多苟在神诡世界张图片合成一张进行显示
- 尽量减少视图Objective-C数量和层次
-
- 减少透明的视图(alpha<1),不透明的就设置opaque为YES
- 尽量避免出现离屏渲染
-
避免离屏渲染
在OpenGL中,GPU有2种渲染方式:
-
- On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓工商银行冲区进行渲染操作;
- Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
-
- 离屏渲染消耗性能的原因
-
-
- 需要创建新giti轮胎的缓冲区
- 离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(缓存视频合并On-Screen)切换到离屏(Off-Screen);等到离objectivec是c语言吗屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕
-
-
- 会缓存清理造成离屏渲染的有:
-
-
- 光栅化,layer.shouldRasterize = YES
- 遮罩,layer.mask
-
-
-
- 圆角,同时设置layer.magitlabsksToBounds = YES、layer.cornerRadius大于(考虑通过Core苟在神诡世界Graphics绘制裁剪缓存的视频怎么保存到本地圆角,或者叫美工提供圆角图片)
- 阴影,layer.shadowXXX,如果设置了layer.shadowPath就不会产生离屏公积金渲染
-
3 耗电量
3.1 应用耗电的主要来源有:
- CPU处理,Processing
- 网络,Ne线程安全tworking
- 定位,线程数Loc宫颈癌ation
- 图像,Gra工龄差一年工资差多少phics
3.2 耗电优化:
- 尽可能降低CPU、GPU功耗
- 少用定时器
- 优化I/O操作
-
- 尽量不google要频繁写入小数据,最好批量一次性写入
-
- 读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API。用dispatch_io系统会优化磁盘访问
-
- 数据量比较大giti的,建议使用数据库gitlab(比如SQLi缓存te、CoreData)
- 网络优化
-
- 减少、压线程数缩网络数据
-
- 如果多次请求的结果是相同的,尽量使用缓存
-
- 使用断点续传,否则网络不稳定时可能多次传输相同的内容
-
- 网络不可用时,不objectivec是c语言吗要尝试执行网络请求
-
- 让用户可以取消长时间运行或者速度很慢的网络操作,设置合适的超时时间
-
- 批量传输,比如,下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块地下载。如果下载广告,一次性多下载一些,然后再慢慢展示。如果下载电子邮件,一线程数次下载多封,不要一封一封地下载
- 定位优化
-
- 如果只是需要快速确定用户位置,最好用CLLocationManager的reque线程的几种状态stLocation方法。定位完成后,会自动让定位硬件断电
-
- 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
-
- 尽量降低定位精度,比如尽量不要使用精度最高的k缓存的视频怎么保存到本地CLLocationAccuracyBest
-
- 需要后台定位时,尽量设置pausesLocationUp线程是什么意思datesAutomatically为YES,如果用户不太可能移动的时候系统会自动暂停位置更新
-
- 尽量不要使用startMonitoringSig枸杞nificantLocationChanges,优先考虑startMonitoringForRegion:
- 硬件检测优化
-
- 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检缓存视频怎样转入本地视频测。在不需要检测的场合,应该及时关闭这些硬件
4 安装包瘦身
安装包(IPA)主要由可执行文件、资源组成,因此对于iOS安装包的giti轮胎瘦身缓存是什么意思也将从这两个方面进行
4.1 资源(图片、音频、视频等)
- 采取无损压缩
- 去除没有用到的资源
4.2缓存视频合并app下载 可执行文件瘦身
- 编译器优化
-
- Strip Linked Productgitee、Make Strings Read-Only、Symbols Hidden by Def缓存清理ault设置为YES
-
- 去掉异常支持,Enable C++ Exceptions、Enable Objective-C缓存视频变成本地视频 Exceptions设置为NO, Other C Flobjectivec是c语言吗ags添加-fno-exceptions
- 利用AppCode(www.jetbrains.com/objc/)检测未使用的代码:菜单栏 -> Code -> Inspect Code
- 编写LLVM插件检测出重复代码、未缓存视频合并被调用的代码
- 生成LinkMap文件,可以查看可执行文件的具体组成,哪些文件偏大
-
- 可借助第三方工具解析LinkMap文件:github.comgoogle/huanxsd/Lin…
4.3 bitcode
xco工龄差一年工资差多少de7之后多了这样的一个设置,默认是打开的。git命令打开bitcode设置后,编译出来的包不是最终的二进制包而是bitcode中间码,Apple会根据编译线程器、应用设缓存视频在手机哪里找备来优化bitcode来给你最终最最优化的二进制应用包。线程的几种状态这样避免了苹果更新了编译器或硬件设备时在提交app包到appstore的问题。同时也享受到了编译器改进带来的好处Objective-C。
但是有gitlab个坑的地方,有些第缓存视频在手机哪里找三方库并不支持bitcode,如线程池的七个参数果要使用对应的第三方库就得关闭这个bitcode。由于时间太久,已经忘了当时是哪些第三方库不支持了,不知道现在有没有支持。
5 其他:
- Facebook 和 Pinterest 维护的 ASDK 可对视图的渲染进行优化
- 网络请求优化:
-
- 网络请求数据缓存:针对google于时效性比较长的可以做缓存,在请求的时候在有效期内直接获取此信息
-
- 网络请求次数优化:请工商银行求开始、取消、回调之前做限制——-AOP面向切片编程
青山不改,绿水长流,感谢大家支线程是什么意思持,希望这篇giti轮胎文章能帮助到你!!