测试-instruments

测试工具: Instruments

目录:

  • 1.Instruments 神器 1 :【 Leaks ,找内存泄漏】(找到引发内存泄漏的起点)
  • 2.Instruments 神器 2 :【 Time Profiler 】(分析代码的执行时间,找出导致程序变慢的原因
  • 3.Instruments 神器 3 : 【 Allocations 】(监测内存使用 / 分配情况)
    1. 参考链接

Instruments 神器 1 :【 Leaks ,找内存泄漏】(找到引发内存泄漏的起点)

分析内存泄露不能把所有的内存泄露查出来,有的内存泄露是在运行时,用户操作时才产生的。那就需要用到 Instruments 的 leaks 了。
【暂停 leak 监听,直接点击红色按钮】


【使用步骤】

  1. 打开了 instrument 的 leaks 之后,会停止工程运行。

?? 【什么时候内存存在泄漏】

  • 当 leaks 里面有一个红色 X 的时候,代表内存存在泄漏。

?? 【定位内存泄漏开始修改】

  • 第一步:选中红色的 X ,下面有个“田”字方格,选中 call tree
  • 第二步:在界面右边,选中设置,选中【 invert call tree 】和【 hide system libraries 】
  • 第三步:选中详情面板里面的一条,双击,跳到代码泄漏处。

leaks 分为两栏

  • 1.leak checks 【内存泄漏分析】
  • 2.all heap & anonymous VM
    1. 右侧的曲线代表内存分配和内存泄漏曲线

进行内存泄漏分析的时候,右下角出现 leaks 调试选项介绍:
第一个: Record Setting 记录设置
第二个: Display Setting 选项设置
第三个: Extended Detail 扩展面板


Instruments 神器 2 :【 Time Profiler 】(分析代码的执行时间,找出导致程序变慢的原因)

结论:与其花费时间在优化小细节上不如多点时间找到你改优化的地方 .


Time Porfier 介绍:

  • Time Profiler 帮助我们分析代码的执行时间,找出导致程序变慢的原因,告诉我们“时间都去哪儿了?”。

【 Time Profiler 实现原理】

  • Time Profiler 分析原理:它按照固定的时间间隔来跟踪每一个线程的堆栈信息,通过统计比较时间间隔之间的堆栈状态,来推算某个方法执行了多久,并获得一个近似值。其实从根本上来说与我们的原始分析方法异曲同工,只不过其将各个方法消耗的时间统计起来。

【位置 1 】,【图中 1 的位置,是开关键,可以开启 app 程序,也可以关闭】这里控制记录过程,点击红色的 “ 记录 “ 按钮可以停止或开始当前正在分析的 app (在记录和停止按钮之间切换),暂停键,如你所想,暂停当前正在运行的 app 。注意这实际上是停止和启动应用程序,而不是暂停它 .


【位置 2 】,【图中 2 的位置,上面的 run of 代表你以前开启了多少个 app ,代表可以回看以前开启的程序,可以看到以前监听到的 CPU 参数】,这里是执行计时器( run timer ),运行定时器和运行导航,定时器显示 APP 已经运行了多长时间,执行了多少次。箭头之间是可以移动的。如果停止,然后使用录制按钮重新启动应用程序,这将开始一个新的运行。显示屏便会显示“ run2 of 2 ”,你可以回到第一次运行的数据,首先你停止当前运行,然后按下左箭头回去


【位置 3 】运行轨道。这里被称作路径( track ),就你选择的 Time Profiler 工具而言,因为只有一个工具,所以这里只有一条路径,关于这里显示的图标的详情,一会你就会在接下来的教程中了解更多。


【位置 4 】扩展面板,在时间探查仪器的情况下,它是用来跟踪显示堆栈。


【位置 5 】【很明显我没有找到 call tree 】详细地面板。它显示了你正在使用的仪器的主要信息,这是使用频率最高的部门,可以从它这里看到 cpu 运行的时间 . 这里是详情面板,展示的是你正在使用的工具的主要信息。就现在而言,这里展示的是最 “ 笨重( hottest ) “ 的方法 – 换句话说,占用 CPU 时间最长的方法。点击上方的 bar 会看到 Call Tree (左手边的那个)并选中 Sample List ,然后你会看到数据的不同视图,视图展示了每一个示例。点击其中几个,你会在 Extended Detail inspector 中看到被捕获的堆栈跟踪。


【位置 6 】【就是右边那堆,在 leak 介绍过的】选项面板,也叫检查器( inspector )面板,一共有三个检查器: record setting (记录设置), display setting (展示设置),还有 extends detail (扩展详情)。(在上一篇文章里有详细介绍)。


??? 【没有使用 Time Profiler 之前使用的方法是】

  1. 自己写测试代码,测试执行时间
    NSDate startDate = [ NSDate date ];   
    for ( int i = 0 ; i < 999 ; i++ ) {  
    // do something  
    }  
    NSDate endDate = [ NSDate date ];   
    NSLog ( @"time:%f" , [ endDate timeIntervalSinceDate: startDate ]);   
    

??? 【使用 Time Profiler 测试需要注意的地方】

  1. 要使用真机测试

Instruments 神器 3 : 【 Allocations 】(监测内存使用 / 分配情况)

Allocations 做的是什么?
Allocations 分配工具。它能给出你所有创建和存储它们的内存的详细信息,它也显示你保留了每个对象的计数。


使用场景介绍
我们经常需要从服务器下载大量图片,特别是开发照片类的应用。但往往稍不注意,内存使用就会暴增,所以得保证把这些图片缓存下来以便重复使用。重新载入图片时,内存都会出现使用峰值。应用先分配大量内存来替换原有图片,然后再释放掉这部分内存,可想而知这样的操作效率高不了,而且如果要下载更大的文件,呃,局面大概会失控吧。用异步方式来加载图片,这样用不着等到所有图片下载完才能在界面中显示。大多数图像缓存库都会把加载工作放到后台,以避免延长主线程的响应周期。


Allocations 界面介绍
分为两块

    1. 一个叫(分配) Allocations
    1. 一个被称为 VM Tracker ( ˈ trakə ,追踪者)(虚拟机跟踪);虚拟机跟踪也是非常有用的,但更复杂一点。

功能介绍

  • 功能 1 :用 Allocations 工具也可以检测僵尸对象
  • ((我们在属性面板中勾选” Enable NSZombie detection ”,其效果和单独使用 Zombies 工具是一样的。))

使用技巧

  • 1 ,每次运行完后,就保存,方便下次测的时候做对比,可以看出修改代码后,性能有没有提升;
    1. 因为 Instruments 在一次运行期间可以记录 App 的多次运行记录。以 Allocations 为例,开启 Instruments 后,每结束一次 Allocations 分析,这条分析就会被记录下来,下次再开启分析时,我们仍然可以看到前一次分析的信息
    1. 通过这些记录,我们可以对比每次分析的差别。这样我们就可以边修改程序,边用 Instruments 来对其进行分析,并通过这种对比来观察修改的效果 > 当然,关闭 Instruments 时,如果不保存信息,这些记录会被清理掉。

使用 Allocations 应该考虑的问题

  • 情况 1 :【这类内存可能由于某些原因被分配,但并非一直需要,只是可能在程序运行期的某个时间需要,如内存缓存的图片】,
  • 情况 2 :【还有一个比较普遍的东西 – 单例。我们可能会为某个模块创建一个单例对象来维护这个模块所需要的数据,但在退出模块后,这个单例对象依然存在。与内存泄露不同,这些对象从技术上讲依然是有效的。但实际上可能在程序后续的运行中不会再被使用。】

上面的情况就是使用 Allocations 需要检测出来的问题。

什么是 Abandoned Memory
Abandoned Memory 做的是什么?
Abandoned Memory 是可以采用所谓的 Generational Analysis 方法来分析,即反复进入退出某一场景,查看内存的分配与释放情况,以定位哪些对象是属于 Abandoned Memory 的范畴。


怎么使用 Allocations ?
先切换到 Generations 列表
第一步:在进入某个模块之前,使用 mark generation ,标记一下
第二步:退出模块的时候,再标记一下
我们可以在程序运行时,在进入某个模块前标记一个 Generation ,这样会生成一个快照。然后进入、退出,再标记一个 Generation


参考链接: