工具Instruments是干啥的就不再介绍了,毕竟用来检测性能的没用过也至少要听过吧!废话就不多说了,这边暂时只有介绍使用的针对优化的还没总结整理后期会更新哈,只能说优化是一条不归路,然而还是踏上了这条路。
本文主要讲解到以下几种常用的检测工具:
1、Time Profiler——检测CPU内存使用情况
2、Core Animation——离屏渲染,图层混合等GPU耗时
3、Leaks——检测内存的使用情况,包括内存泄露问题
4、Energy Log——耗电检测工具
5、Network——流量检测工具
前提
先检测是否开启了debug模式:
如果没有开启,那设置一下哈。
检测是否设置了dSYM File,设置后的工程配置如下:
如果没有配置dSYM File在Instruments上检测结果没法直接查看对应的代码位置,只是显示地址。
这个很重要哈,新手经常没配置,然后各种点击查看没法看到具体出问题的代码,配置完成后开始下面的介绍。
设置完成后先运行一遍cmd + R
,运行完成后Profile快捷键cmd+ i
,再选对应的检测。
Time Profiler
TimeProfiler见名知意:时间分析工具,它会按照设定的时间间隔(默认1毫秒)来跟踪每一线程的堆栈信息(stacktrace),并通过比较时间间隔之间的堆栈状态,来推算出某个方法执行了多久,给出一个近似值。
如果出现以上界面,一堆的地址那就是没有配置dSYM File
,下面讲解一下Call Tree
。
Separate by Thread
按线程分开做分析,这样更容易揪出那些吃资源的问题线程。特别是对于主线程,它要处理和渲染所有的接口数据,一旦受到阻塞,程序必然卡顿或停止响应。
Invert Call Tree
反向输出调用树,把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。
Hide Missing Symbols
隐藏缺失符号,如果dSYM文件或其他系统架构缺失,列表中会出现很多奇怪的十六进制的数值,用此选项把这些干扰元素屏蔽掉,让列表回归清爽。
Hide System Libraries
隐藏系统库文件。过滤掉各种系统调用,只显示自己的代码调用。
Flattern Recursion
拼合递归,将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条。
Top Functions
找到最耗时的函数或方法。
以上的属性可以同时多选在其余的检测里面也是通用的,瞬间就有种酸爽的感觉了。
Core Animation
CoreAnimation系要注意的一点是必须是真机调试,用于调试离屏渲染,绘图,动画,等操作。
启用Core Animation
Xcode 9.3之后做了调整与Xcode 9.2有了很大的区别。
Xcode 9.3
Xcode 9.3 Core Animation
检测设置debug option换成如下,只需要将程序运行起来就可以直接用了,不需要再进入Instruments
(当然Core Animation
界面还是有用的毕竟还是可以看FPS
,FPS
越高说明界面就越流畅,最高是60,反之越多就越差哈)算是一种便捷方式吧,但是不清楚的还是进入Instruments
可以让你找到怀疑人生。
Xcode 9.2
Xcode 9.2以及之前都是在Core Animation
检测界面里面一般都是在底部,不同的版本有些差异。
属性介绍
Color Blended Layers—— 图层混合
显示出被混合的图层BlendedLayer(用红色标注),BlendedLayer是因为这些Layer是透明的(Transparent),系统在渲染这些view时需要将该view和下层view混合(Blend)后才能计算出该像素点的实际颜色。所以红色越少越好。
Color Hits Green and Misses Red——图层缓存
很多视图Layer由于Shadow、Mask和Gradient等原因渲染很高,因此UIKit提供了API用于缓存这些Layer:[layer setShouldRasterize:YES],系统会将这些Layer缓存成Bitmap位图供渲染使用,如果失效时便丢弃这些Bitmap重新生成。所以绿色越多,红色越少越好。
Color Offscreen-Rendered Yellow——离屏渲染
Offscreen-Rendering离屏渲染意思是iOS要显示一个视图时,需要先在后台用CPU计算出视图的Bitmap,再交给GPU做Onscreen-Rendering显示在屏幕上,因为显示一个视图需要两次计算,所以这种Offscreen-Rendering会导致app的图形性能下降。所以黄色越少越好。
Color Misaligned Images——图片缩放
MisalignedImage表示要绘制的点无法直接映射到频幕上的像素点,此时系统需要对相邻的像素点做anti-aliasing反锯齿计算,增加了图形负担,通常这种问题出在对某些View的Frame重新计算和设置时产生的。
Color Copied images
标注应用绘制时被Core Animation复制的图片。
Color Immediately
Instruments在做color-flush操作时取消10毫秒的延时。
Color Compositing Fast-Path Blue
标记由硬件绘制的路径。
Flash Updated Regions
重绘的区域,勾选这些不同的选项可以在真机上看到不同颜色的渲染标注。
Leaks
Leaks是iOS程序中用来检测内存泄漏的工具,灵活的运用Leaks可以帮助我们预防程序中的内存泄漏防止程序内存耗用过大被挂起。首先双击Leaks点击左上角红色圆点运行,并且选中CallTree,在CallTree选项中勾选InvertCallTree和HideSystemLibraries选项如下图所示:
检测的结果如下:
针对对应的问题双击进入查看对应的代码。
Energy Log
电量检测,可以用Instruments
上面的工具进行检测,具体如下:
双击打开EnergyLog直接点击红色圆点运行程序,左侧依次即可看到CPU活动比例,网络活动比例,亮度状态,手机睡眠状态,手机连接蓝牙状态,手机连接wifi状态,手机GPS状态这次都是手机耗电的构成部分。
除了直接运行Energy Log
检测耗电,还可以直接用用手机开启开发者模式,记录耗电情况然后将日志导入Energy Log
,用来查看运行该App的耗电情况,具体操作就不多说了,有兴趣可以看这哥们的文章iOS耗电量检测与优化。
我们也可以在Xoce启动程序时点击Xcode左侧状态栏,选择EnergyImpact选项,在右侧即可看到手机实时的耗电情况。
对应的颜色状态:
绿色—合理
黄色—资源消耗高,你的程序比较耗电.
红色—资源消耗非常高,仅仅轻度使用你的app,用户就可以明显感到电量在消耗,用一会儿基本能感觉到手机发烫。
Network
双击打开Network直接点击红色圆点运行程序在上方便可以看到手机网络的输入输出大小,用鼠标拦截住一块区域就可以查看这个区间内是我们的App发生的网络消耗还是其他进程发生的,我们还可以查看到网络请求的本地地址和服务地址,输入和输出的大小等信息下面将详细介绍各种查看检测等方式:
上图随便圈出一块消耗网络资源的地方,此时在下方有三个选项:
第一个:Processes代表查看网络进程,也就是你的App和其他程序的使用流量总大小。
第二个:Connections代表所有的访问网络请求的端口,输入输出大小,本地地址,数据包大小,往返时间等信息。
第三个:interfaces即在用户的角度当前手机的整体网络使用情况(不区分线程,只区分网络使用类型- wifi Or流量)。
Processes
我们可以发现工具把整个网络访问划分为两部分,我们的App和其他的进程,分别显示出它们的:
- process:进程名。
- data in请求数据大小。
- packets in请求数据包大小。
- data out发送数据大小。
- packets out发送数据包大小。
- duplicate Data Recv重传数据大小。
- out-of-Order data传输失败数据大小。
- retransmissions网络重传次数。
Connections
这个选项把所有的网络请求发生的数据交互明细都打印出来可以让我们一目了然的发现数据来自哪里,到哪里去,大小是多少,帧率是多少等信息。
相比Processes选项Connections选项多出了
- local代表本地访问地址。
- remote远程服务地址。
- shortest Roundtrip:最短往返时间。
- avg. Roundtrip:平均往返时间。
interfaces
interfaces代表在用户层面上的手机的网络使用情况,其中Interface选项代表网络环境,Connections代表总体连接次数其他选项和以上意义相同。
结语
常用的检测就介绍到这哈,相信小伙伴已经可以上车飚一波了吧!