Instrument的使用
1.Instrument打开
product->profile打开(command+I)
2.常用功能
Time Profiler:CPU分析工具分析代码的执行时间。
Core Animation:离屏渲染,图层混合等GPU耗时。
Leaks:内存检测,内存泄漏检测工具。
Energy Log:耗电检测工具。
Network:流量检测工具。
Allocations:检测系统内存使用、分配情况
3.为什么检测性能时一定要用真机
首先模拟器运行在Mac上,Mac上的CPU比手机上的CPU快很多。Mac上的gpu和手机上的gpu完全不同,模拟器不得已要模拟移动设备的gpu,因此gpu相关的操作在模拟器上速度更慢。所以模拟器上的性能数据和真机上的性能数据差别很大。
4.为什么检测性能时应用程序一定是发布配置而不是调试配置
因为在发布环境打包的时候,编译器会引入一系列提高性能的优化。
5.Time Profiler
Time Profiler用来监测应用消耗CPU的情况。
call tree选项的设置
Separate By Thread:只有这样才能看到消耗CPU最大的线程
Invert Call Tree:invert(转化,反转),勾选这个可以看到方法调用路径最深的方法占用的CPU耗时。call tree本来应该是从外层到里层,把它invert之后最深层的方法暴露在最外面。这样更容易找到最耗时的操作。
Hide Missing Symbols:如果dSYM无法找到你的APP或者调用系统框架的话,那么表中将看到调用方法名只能看到16进制的数值,勾选这个选项则可以隐藏这些符号,便于简化分析数据。
Hide System Libraries:这个非常有用啦,勾选了以后只会显示自己app的耗时代码,不会显示系统的耗时代码。
Top Functions:找到最耗时的函数或方法
6.Allocations
运行程序的时候可以看到每个操作占用的内存。
7.Leaks
如果两个对象互相强引用,一个对象被释放以后,arc无法判断另一个对象还有没有用了,因此不会释放另一个对象。这个时候,就造成了内存泄漏。
应用运行的时候,leaks会检测系统中有哪些对象发生了内存泄漏。
有一列叫做leaked object会指明具体是哪个对象造成了内存泄漏。
8.Core Animation
主要是用来看界面的fps,离屏渲染,内存消耗等。
这一段参照了文章:UIKit性能调优实战讲解
Color Blended Layers 勾选,用于监测系统中哪里发生了图层混合,如果发生了图层混合就会显示为红色。
对于UIView来说,首先不能把控件设置为透明的,如果是透明的就会发生图层混合。UIView默认是不透明的,opaque(不透明的)默认值是true。除了设置UIView不透明以外,还需要给控件设置背景颜色,虽然设置了和背景相同的颜色看不出来,但是却可以解决图层混合问题。
对于UIImageView来说,不仅他自身是不透明的,他的图片也不能含有alpha通道。
如果UILabel中有中文,依然会发生图层混合。
Color Hits Green and Misses Red 勾选,表示命中缓存就会显示为绿色,没有命中就显示为红色。绿色越多越好。
控件被光栅化以后,会缓存。
关于光栅化:光栅化会手动开启离屏渲染。
光栅化的核心思想在于缓存。一个layer被设置成光栅化以后会渲染成位图放在缓存里。当屏幕滑动时,可以直接从缓存里读取,不需要再去渲染。光栅化仅适用于较复杂的静态效果。因为写入缓存再去读取会消耗很多的时间,如果视图一直变化的话,缓存不会命中,使用光栅化就没有意义了。
Color Misaligned Images 勾选,如果图片需要缩放则用黄色覆盖。如果没有像素对齐,用紫色覆盖。
图片的缩放需要占用时间,这也就解释了为什么无论是本地图片还是从网络下载的图片最好逗能附和frame的大小,这样就省去了图片缩放的时间。
Color Offscreen-Rendered Yellow 勾选,会把发生离屏渲染的地方标记为黄色。
在另一个文章中已经讲了什么时候会发生离屏渲染,这里重点讲解一下光栅化的问题,和阴影问题。
如果一个控件使用了阴影,还没有手动指定阴影路径,系统就会自动去计算,这个时候就引发了离屏渲染。
Color Copied Images 勾选,检测图片的格式转换,如果转换了就显示为蓝色。
如果我们使用的图片格式,不能被GPU支持,那么就需要CPU去转化格式,这个时候就消耗了CPU资源。