iOS-Instruments

Instruments是一款XCode自带的性能分析工具。

简介

Instruments其本身是独立App,可以单独使用。Instruments可用于:

  • 测验一个或多个App进程的行为;
  • 测验设备的相关元素,例如Wi-Fi,蓝牙;
  • 在真机或者虚拟机上进行分析;
  • 创建自定义的DTrack Instruments来分析系统以及App的行为;
  • 跟踪问题在源码中的位置;
  • 对App进行性能分析;
  • 发现App的内存问题,例如泄漏,越界等;
  • 提升App的电池节能;
  • 进行系统级别的分析解决问题;
  • 将Instruments设置保存为模板。

工作流

Instruments的工作流如下:

Instruments

使用方式

打开

打开方式有如下几种:

Xcode中打开:

Instruments

Dock中打开:

Instruments

Terminal中打开:

1
open /Applications/Xcode.app/Contents/Applications/Instruments.app

使用

使用方式有如下几种:

Product->Profile:

Instruments

Run->Profile:

Instruments

模板

如果需要多次使用同一个模板,可以Edit Scheme:

Instruments

Profile里面设置:

Instruments

数据录制

打开Instruments后,可以看到以下窗口:

Instruments

想要查看单独某项的,例如内存或者网络连接,可以直接点击进去,如果想要同时查看多项,点击“Blank”,生成一个空白的面板。然后点击右上角的“+”号,可以将某一项拖到左边的面板上。

Instruments

完成后,可以点击左上角的红色按钮开始录制。

数据分析

下面以内存分配为例,录制过程中,下面的详细面板会出现对应的统计信息。

Instruments

如果要查看某个时间段,可以在右上角的时间线那里,拖动选择,还可以通过触摸板手势进行缩放。

Instruments

除了统计信息,还可以查看调用的函数栈:

Instruments

Instruments

如果不想查看这么详细的,也可以通过右下角的详情按钮查看核心的函数栈:

Instruments

对于App自身的函数,非系统函数的,可以双击查看源码:

Instruments

Instruments

如果想在XCode中查看源码,点击下面的Xcode按钮:

Instruments

常见场景

CPU

在追求性能时,我们需要查看App对于CPU的使用情况,方式如下:

使用Activity Monitor查看设备的CPU使用率对比。

Instruments

使用Time Profiler查看CPU的多核的负载情况,包括App、多线程以及对应到某个函数对CPU的负载。例如,如果单个核的负载远高于其他核,那么说明需要进行优化。如果主线程负载过重,那么可能会导致界面相应缓慢,应该把工作移到其他线程上。

Instruments

使用Performance monitor Counters(PMC)来寻找性能瓶颈。例如,通过查看某个硬件相关的Event,例如ARM64Instructions,来查看是否有过度复杂的条件分支,可以进行优化。

Instruments

内存

使用Activity Monitor查看设备的物理内存和虚拟内存的使用情况。

Instruments

其中,名词对应如下:

  • Physical Memory Wired:操作系统使用的内存大小;
  • Physical Memory Active:进程(非操作系统)使用的内存大小;
  • Physical Memory Inactive:刚释放的内存大小;
  • Physical Memory Used:在录制期间使用的内存大小;
  • Physical Memory Free:空闲可用的内存大小;
  • Total VM Size:虚拟内存的总大小;
  • VM Page Out Bytes:存到硬盘的内存大小;
  • VM Swap Used:加载硬盘的内存大小。

使用Allocations查看App的内存分配情况。

Instruments

Allocations可以用于发现Abandoned MemoryAbandoned Memory指被分配,但是没有用到的内存。例如,对同一张图片进行了两次缓存,或者没有用到的数组。Abandoned Memory一般会被App某处引用,Instruments无法判断其重要性,只能通过重复执行一组操作,观察内存是否会持续增长来寻找。例如,重复多次的启动和关闭一个游戏App,打开和关闭一个Window,都不应该导致内存的持续增长,而应该是比较稳定的内存状态。

使用Leaks查找App的内存泄漏。

Instruments

Leaks可以用于发现Leaked MemoryAbandoned Memory指被分配,但是没有被释放,并且不再被App引用的内存。因为没有引用,所以也没办法进行内存释放。例如,App每次在绘画时,都生成一个新的矩形对象,但绘画完成后并没有释放,则绘画次数越多,内存泄漏越严重。

在查看详细信息时,可以点击地址旁边的箭头来查看引用次数,然后点击右边的按钮来屏蔽系统函数。

Instruments

对于使用ARC的App,可以通过Cycels & Roots视图来寻找循环引用的对象。

Instruments

使用Zombies查找App依然被引用的已释放内存。

Zombies是指那些已经被释放,且不再使用的内存,但仍然被App在某处引用。例如,图片的缓存已经删除了,但是,App依然对该张图片存在引用对象。

Instruments

如果在录制过程中,出现NSZombie对象,则该对象会被标记,App会自动Crash,并且出现一个Zombie消息弹窗。可以通过其查看该对象的分配和释放过程。尽管Instruments会帮助识别NSZombie对象,但是最好还是自己再对其分配和释放过程进行确认,并小心的修改代码,解决问题。

电量

对电量造成影响的因素有很多,例如CPU活动,网络活动,屏幕亮度以及其他因素。通过Energy Log可以对App的这些因素进行观察,看是否能减少各方面对电量的影响。

Instruments

这里的电量影响水平是用0到20来衡量的,但是这个数字是主观的,有时候App确实需要比较高的数值来保证使用,例如在App进行复杂的网络操作的同时,使用GPS。所以,需要寻找的是那些异常操作的高值,例如做很少的操作,但对电量影响却很高。

补充

导入dSYM

对于不是在同一台Mac上调试的App,Mac上会找不到dSYM,对应不到源码,可以在Instruments导入dSYM文件:

Instruments

Instruments

导入日志

iphone手机可以在日常使用时,对电量和网络的情况进行录制,操作如下:

Instruments

Instruments

Instruments

Instruments