一、Instruments简介
(1)Instruments 是应用程序用来动态跟踪和分析 Mac OS X 和 iOS 代码的实用工具。 这是一个灵活而强大的工具,它让你可以跟踪一个或多个进程,并检查收集的数据。 这样,Instruments 可以帮你更好的理解应用程序和操作系统的行为。
(2)Instruments包括 Blank(空白)、Activity Monitor(活动监视器)、Allocations(内存分配)、Cocoa Layout(页面布局)、Core Animation(核心动画)、Core Data(数据库)、counters(计数器)、Energy Log(电量输出日志)、File Activity(文件活动)、Leaks(内存泄漏)、Metal System Trace(金属系统跟踪)、NetWork(网络监测)、System Trace(系统跟踪)、Time Profiler(时间分析)、Zombies(僵尸对象)等16个功能。
(3)官方使用指南地址:
二、Instruments启动方式
(1)Xcode -> Open Developer Tool -> Instruments
(2)Product -> Profile
(3)长按启动按钮 -> Profile
三、Instruments使用
(1)Activity Monitor 活动监视器
(2)Allocations(内存分配)
苹果开发文档内存分类:
1.Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument).
2.Abandoned memory: Memory still referenced by your application that has no useful purpose.
3.Cached memory: Memory still referenced by your application that might be used again for better performance.
其中Leaked memory 和Abandoned memory 都属于应该释放而没释放的内存,都是内存泄露。
(3)Cocoa Layout 页面布局
观察NSLayoutConstraint对象的改变,帮助我们判断什么时间什么地点的constraint是否合理。
(4)Core Animation 核心动画
检测Core Animation 性能工具,主要针对GPU和CPU的使用进行优化。通常会把屏幕渲染工作交给GPU来处理;CPU主要负 责运算等方面的处理。(Core Animation does not support the iOS Simulator platform)
根据WWDC的说法,当在滑动视图时,FPS低于45的时候,用户会感觉到滑动有卡顿。
1. Color Blended Layers (图层混合)
界面都是会出现多个UI控件叠加的情况,如果有透明或者半透明的控件,那么GPU会去计算这些这些layer最终的显示的颜色。基于渲染程度对屏幕中混合区域进行绿到红的高亮显示,越红表示性能越差,会对帧率等指标造成较大影响。
优化方法:设置opaque 属性为true;调整布局,尽量不要叠加;给View设置一个不透明的颜色,没有特殊需要设置白色即可。
2. Color Hits Green and Misses Red(光栅化)
当UIView.layer.shouldRasterize = YES 时,在触发离屏绘制的同时,会将光栅化后的内容缓存起来,如果对应的layer及其sublayers没有发生改变,在下一帧的时候可以直接复用。这将在很大程度上提升渲染性能。
3. Color Copied Images(图片颜色格式)
苹果的GPU只解析32bit的颜色格式,对于GPU不支持的色彩格式的图片只能由CPU来处理,这样的图片为蓝色,蓝色越多性能越差。因为如果在滚动加载大量图片时,由CPU来处理图片,可能会阻塞主线程。
4. Color Non-Standard Surface Formats (标记不标准的表面颜色格式)
5. Color Immediately(颜色刷新频率)
当执行颜色刷新的时候移除10ms的延迟,因为可能在特定情况下你不需要这些延迟,所以使用此选项加快颜色刷新的频率。不过一般这个调试选项我们是用不到的。
6. Color Misaligned Images(图片大小)
这个选项可以帮助我们查看图片大小是否正确显示。如果image size和imageView size不匹配,image会出现黄色。要尽可能的减少黄色的出现,因为image size与imageView size不匹配,会消耗资源压缩图片。
7. Color Offscreen-Rendered Yellow(离屏渲染)
离屏渲染Off-Screen Rendering 指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。还有另外一种屏幕渲染方式-当前屏幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。 离屏渲染会先在屏幕外创建新缓冲区,离屏渲染结束后,再从离屏切到当前屏幕, 把离屏的渲染结果显示到当前屏幕上,这个上下文切换的过程是非常消耗性能的,实际开发中尽可能避免离屏渲染。
触发离屏渲染Offscreen rendering的行为:
(a)drawRect:方法
(b)layer.shadow
(c)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
(d)layer.shouldRasterize
(e)layer.mask
(f)layer.masksToBounds && layer.cornerRadius
这里有需要注意的是第三条layer.shouldRasterize ,其实就是我们本文讲的第二个选项光栅化,光栅化会触发离屏渲染,因此光栅化慎用。第六条设置圆角会触发离屏渲染,如果在某个页面大量使用了圆角,会非常消耗性能造成FPS急剧下降,设置圆角触发离屏渲染要同时满足下面两个条件:layer.masksToBounds = YES;layer.cornerRadius = 5;
为了尽可能避免触发离屏渲染,我们可以使用贝塞尔曲线设置圆角。
8. Color Compositing Fast-Path Blue (快速路径)
标记由硬件绘制的路径为蓝色,蓝色越多越好,可以对直接使用OpenGL绘制的图层进行高亮。
9. Flash Updated Regions (重绘区域)
这个选项会对重绘的内容高亮成黄色,重绘就是指使用Core Graphics绘制,绘制会损耗一定的性能,因此重绘区域应该越小越好。
(5)Core Data(数据库)
主要是用于监测读取、缓存未命中、保存等操作,能直观显示是否保存次数远超实际需要。
(6)counters(计数器)
从用户管理的点事件计数器仪器记录信息。它可以记录从一个过程或系统上运行的所有进程的信息。需要真机测试
(7)Energy Diagnostic 能量诊断
用于Xcode下的Instruments来分析手机电量消耗的。(需要真机测试)
(8)File Activity 文件活动
这个模板活动监视器文件和目录,包括文件打开或者关闭,文件权限修改,目录创建,文件移动等。不支持iOS 平台。
(9)Leaks 内存泄漏
查看内存使用情况,检查泄漏内存,并提供按类别分配对象内存地址以及内存地址历史分配记录和泄漏块的统计信息。
1. Separate by Category 类别分离
2. Separate by Thread 线程分离,只有这样才能在调用路径中能够清晰看到占用CPU最大的线程.
3. Invert Call Tree 从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时,比如FuncA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面.
4. Hide System Libraries 隐藏系统调用库
5. Flatten Recursion 处理递归(自己调用自己),在每个栈中只跟踪一个,而不是多个。
(10)Metal System Trace(金属系统跟踪)
金属系统跟踪通过从应用程序,驱动程序和gpu层提供跟踪信息来描述ios和macos金属应用程序的性能。
(11)Network 网络监测
分析应用程序如何使用TCP / IP和UDP / IP连接使用连接仪器。
(12)System Trace 系统跟踪
该模板提供了系统行为的全面信息。它显示线程何时调度,并显示从用户到系统代码的线程转换,通过系统调用和内存操作。这个模板可以在OS X操作系统和iOS上使用。
(13)System Usage 系统使用
这个模板监视一个应用程序和记录系统的I / O活动相关的文件,套接字和共享内存。这包括输入,输出,时间回溯,调用树,乃至每一次响应。该模板只可用于iOS。
(14)Time Profiler 时间分析器
用来检测app中每个方法所用的时间,并且可以排序,并查找出哪些函数占用了大量时间。
(15)Zombies 僵尸对象
用来检测过度释放的“僵尸”对象,还提供了数据对象分配的类以及所有活动分配内存地址的历史记录。
使用Zombies工具来查找僵尸对象: Zombies工具的查找原理其实和设置NSZombieEnabled环境变量的调试方法是一样的,启动Zombies后在内部设置了NSZombieEnabled为true。
启用了NSZombieEnabled的话,它会用一个僵尸对象来代替已释放对象。也就是在引用计数降到0时,该僵尸实现会将该对象转换成僵尸对象。僵尸对象的作用是在你向它发送消息时,就不会向之前那样Crash或者产生 一个难以理解的行为,而是放出一个错误消息,它会显示一段日志并自动跳入调试器, 因此我们就可以找到具体或者大概是哪个对象被错误的释放了。