同窗,我这里有一个iOS面试的加分项,你要不要了解一下?

使用 Instruments 作 iOS 程序性能调试 cover SamirChenios

Instruments 是 Xcode 的一个工具集,为咱们提供了强大的程序性能分析及测试能力。使用 Instruments 你能够作下面这些事:缓存

检查一个或多个应用或进程的行为。 检查设备相关的功能,好比:Wi-Fi、蓝牙等。 在真机或模拟器上进行性能测试。 建立自定义的 DTrace 来分析系统以及应用的各类行为。 跟踪源码中的问题。 对 App 进行性能分析。 查找 App 中的内存问题,好比:内存泄露(Leaked memory)、废弃内存(Abandoned memory)、僵尸(zombies)等。 给出程序优化的建议。 进行系统级别的问题定位。 经过脚本记录一个用户行为序列,从而能够经过运行脚本对你的 iOS 应用进行可重复屡次的自动化测试。 保存测试配置模板以供复用。 能够看到 Instruments 功能不少,这里先介绍一下咱们在开发中经常使用到的几种:CPU 性能测试、图形性能测试、内存性能测试。ide

虽然 Instruments 是 Xcode 的一个工具集,可是它是以一个独立的 App 的形式存在的,你能够在 Xcode -> Open Developer Tool -> Instruments 中打开它。函数

CPU 性能工具

要看程序执行时间性能,主要有下面几步:性能

一、先在 Xcode 中对当前的项目作 Profile (Command-I):测试

这时就会打开 Profiling Template 选项对话框:优化

二、选择 Time Profiler 这个模板,并点击 Choose 按钮。ui

三、进入 Instruments 后,选择正确的设备和应用程序:线程

四、点击红色按钮运行后,就能获得 CPU 性能的结果了:

咱们还能在时间轴面板里面去选择一段时间来查看该时间段里更为细节的 CPU 性能:

同时在中间的导航条以及右下角的控制面板中,咱们还能够经过不一样的选项来选择数据展现的形式和维度。

从这个结果中,咱们能够看到不一样的线程以及方法调用占用的时间,从而能够评估出 CPU 性能的瓶颈和优化方向。

五、除此以外,咱们还能在 Instruments 选择使用 Counters、Activity Monitor、System Trace 等 Profiling Template 对程序作 CPU 性能考量。

六、须要注意的是,有时候若是你使用 Instruments 查看调用堆栈时可能看到的都是地址而不是函数名,这样就不太好定位问题了。这时候你能够把相关项目的 Build Settings - Debug Information Format 的 Debug 和 Release 都设置为 DWARF with dSYM File,这样就能将对应的堆栈信息符号化显示了。

图形性能

关于图形性能方面,咱们平时最关注的应该就是「帧率」这个概念了。在 Instruments 中,咱们可使用 Core Animation + Time Profiler 来评估图形性能。使用步骤以下:

一、同「CPU 占用性能测试」同样,先在 Xcode 中对当前的项目执行 Profile (Command-I),并在打开的对话框中选择 Core Animaiton 这个模板:

二、进入 Instruments 后,选择正确的设备和应用程序。

三、点击红色按钮运行应用程序,随着咱们操做 App 界面,就能够看到帧率的变化和数据了:

在滑动屏幕时,帧率越高表示性能越好,帧率太低则意味着屏幕可能会出现卡顿。

四、在右下角面板的 Display Settings 区域,咱们能够看到多个 Debug Options:

Color Blended Layers,这个选项选项基于渲染程度对屏幕中的混合区域进行绿到红的高亮显示,越红表示性能越差,会对帧率等指标形成较大的影响。红色一般是因为多个半透明图层叠加引发。 Color Hits Green and Misses Red,当 UIView.layer.shouldRasterize = YES 时,耗时的图片绘制会被缓存,并当作一个简单的扁平图片来呈现。这时候,若是页面的其余区块(好比 UITableViewCell 的复用)使用缓存直接命中,就显示绿色,反之,若是不命中,这时就显示红色。红色越多,性能越差。由于栅格化生成缓存的过程是有开销的,若是缓存能被大量命中和有效使用,则整体上会下降开销,反之则意味着要频繁生成新的缓存,这会让性能问题雪上加霜。 Color Copied Images,对于 GPU 不支持的色彩格式的图片只能由 CPU 来处理,把这样的图片标为蓝色。蓝色越多,性能越差。由于,咱们不但愿在滚动视图的时候,由 CPU 来处理图片,这样可能会对主线程形成阻塞。 Color Immediately,一般 Core Animation Instruments 以每毫秒 10 次的频率更新图层调试颜色。对某些效果来讲,这显然太慢了。这个选项就能够用来设置每帧都更新(可能会影响到渲染性能,并且会致使帧率测量不许,因此不要一直都设置它)。 Color Misaligned Images,这个选项检查了图片是否被缩放,以及像素是否对齐。被放缩的图片会被标记为黄色,像素不对齐则会标注为紫色。黄色、紫色越多,性能越差。 Color Offscreen-Rendered Yellow,这个选项会把那些离屏渲染的图层显示为黄色。黄色越多,性能越差。这些显示为黄色的图层极可能须要用 shadowPath 或者 shouldRasterize 来优化。 Color OpenGL Fast Path Blue,这个选项会把任何直接使用 OpenGL 绘制的图层显示为蓝色。蓝色越多,性能越好。若是仅仅使用 UIKit 或者 Core Animation 的 API,那么不会有任何效果。若是使用 GLKView 或者 CAEAGLLayer,那若是不显示蓝色块的话就意味着你正在强制 CPU 渲染额外的纹理,而不是绘制到屏幕。 Flash Updated Regions,这个选项会把重绘的内容显示为黄色。不应出现的黄色越多,性能越差。一般咱们但愿只是更新的部分被标记完黄色。 咱们可使用这些选项,来监测更加具体的图形性能。

五、咱们还能够选择使用 OpenGL ES Analysis、GPU Driver 等模板来监测图形相关性能。

内存性能

Instruments 能够帮咱们了解到应用程序使用内存的几个方面:

全局内存使用状况(Overall Memory Use): 从全局的角度监测应用程序的内存使用状况,捕捉非预期的或大幅度的内存增加。 内存泄露(Leaked memory): 未被你的程序引用,同时也不能被使用或释放的内存。 废弃内存(Abandoned memory): 被你的程序引用,可是没什么卵用的内存。 僵尸对象(Zombies): 僵尸对象指的是对应的内存已经被释放而且再也不会使用到,可是你的程序却在某处依然有指向它的引用。在 iOS 中有一个 NSZombie 机制,这个是为了内存调试的目的而设计的一种机制。在这个机制下,当你 NSZombieEnabled 为 YES 时,当一个对应的引用计数减为 0 时,这个对象不会被释放,当这个对象再收到任何消息时,它会记录一条 warning,而不是直接崩溃,以方便咱们进行程序调试。 这里咱们介绍下查找内存泄露的过程:

一、同「CPU 占用性能测试」同样,先在 Xcode 中对当前的项目执行 Profile (Command-I),并在打开的对话框中选择 Leaks 这个模板:

二、进入 Instruments 后,选择正确的设备和应用程序。

三、点击红色按钮运行应用程序,咱们能够看到以下界面:

四、在 Display Settings 中勾选 Invert Call Tree 和 Hide System Libraries 或其余选项能够过滤显示的数据。

五、在导航栏的筛选框中,咱们能够输入关键字来筛选数据。

六、在实际使用中,咱们进入一个页面后再退出,发现相关的内存分配没有清空,这时候就发生内存泄露了。咱们查看更细节的调用信息,追踪到可能形成内存泄露的代码位置:

七、咱们还可使用 Activity Monitor、Allocations、Zombies 等模板来针对性地作内存监测。

参考

Instruments User Guide

相关文章
相关标签/搜索