Instruments--iOS组建与框架——iOS SDK高级特性剖析

Instruments是Xcode自带的15个剖析和分析工具的统称,这些工具如表25.1所示。要详细介绍这些工具(instrument),需要一部专著;但对普通的iOS开发人员来说,对如何使用和解读这些工具有基本了解就够了。

表25.1 Xcode提供的工具及其功能

工具 描述
Allocations 跟踪内堆存分配,以测量堆内存的使用情况
Leaks 度量内存使用情况、检查内存泄漏并提供有关对象分配的统计信息
Activity Monitor 监视系统活动,包括CPU、内存、磁盘、网络和统计信息
Zombies 度量内存使用情况,但专注于检测被过度释放(over-released)的“僵尸”对象。还按类提供有关对象分配的统计信息以及所有对象分配的内存地址记录
Time Profiler 对系统CPU运行的进程进行基于时间的采样,开销很低
System Trace 提供有关系统行为的信息:指出线程被调度的时间以及从用户代码到系统代码的切换
Automation 执行一个脚本,以模拟用户与iOS应用UI的交互
File Activity 监视文件和目录活动,包括打开或关闭文件、文件访问权限修改、目录创建、文件移动等
Core Data 跟踪Core Data文件系统活动,包括检索、缓存缺失次数(cache misses)和保存
Energy Diagnostics 提供有关能耗的诊断信息以及主要设备部件的开关状态
NetWork 分析TCP/IP和UDP/IP连接的使用情况
System Usage 记录单个进程中与文件、套接字和共享内存相关的I/O系统活动
Core Animation 对使用Core Animation的进程和图形性能和CPU使用情况进行监视
OpenGL ES Driver 度量进程的OpenGL ES图形性能和CPU使用情况
OpenGL ES Analysis 度量和分析OpenGL ES活动,以检测OpenGL ES错误和性能问题,还就如何解决这些问题提供建议

1 Instruments的界面

要在Xcode中访问Instruments,可选择目标设备(模拟器或实际设备),再选择菜单product>Profile。这将打开如图1窗口。选择工具后,还可使用库添加其他工具,如图2所示。

1.选择要在剖析模式下运行应用后运行的工具

Instruments界面包含多个部分,这些部分的具体情况随当前运行的工具而异。

Instruments窗口顶部是工具栏,其中包含各种控件,如用于暂停、记录和重新执行当前目标的按钮;还可从当前运行的所有进程中选择新目标。另外,还可指定检查范围,将不在左、右标记之间的内容排除在外。

Instruments会保存应用每次运行的数据,让您一眼就能看出两次运行之间的性能有何不同。您还可以使用库添加新工具,以同时进行多项测试。左边的视图包含选定工具的设置,可使用视图按钮显示/隐藏该视图。底部的视图包含正在运行的测试的详细信息,如Call Tree或Statistics;这个视图显示的信息也随选定的工具而异。最后一个视图史上右边的扩展信息视图,通常包含中间视图中选定项的栈跟踪。

2.Instruments的基本用户界面(这里运行的工具是Allocations)

对于中间视图或右边视图显示的基本对象,大多可通过双击来显示额外信息,如相应的代码段。要熟悉工具的更详细信息,可单击工具名旁边的i按钮。

在接下来的两小节中,将探讨两个最常用的工具。第一个是Time Profiler,开发人员使用它来确定执行应用的哪些代码花费的时间最长。通过分析执行每行代码花费的时间,开发人员可对花费的时间最长的代码进行优化和改进,以提高应用的总体速度和性能。要探讨的第二个工具集是Leaks和Allocations,它们让开发人员能够分析应用的内存使用情况,轻松地找出内存泄漏以及被过度释放的对象。

2.探索Instruments:Time Profiler

在代码执行速度方面,Time Profiler提供了具体到行的信息。可能导致应用速度缓慢的瓶颈很多,从等待网络调用完成到过度频繁地读写存储器。然而,一种导致性能问题的常见原因是过度使用CPU,这种问题也最容易解决。Time Profile向开发人员提供各种调用占用的CPU时间,让开发人员能够将重点放在有问题的地方,进而改善性能。

Time Profiler可从工具模版列表中选择,它可在模拟器上运行,也可在设备上运行。剖析CPU使用情况时,千万别忘了设备通常比模拟器慢得多,而用户是在设备而非模拟器上运行软件。

对于CPU使用率极高的应用,Time Profiler的分析结果类似于3所示。顶部的紫色图形指出了CPU使用率,拖曳时间条可获悉特定时间的CPU使用率。调用树指出,99.6%的处理时间消耗在Main Thread上;进一步展开后发现,99.1%的时间消耗在main()上。这种信息好像帮助不大,因为Objective-C应用的很大一部分时间就应该消耗在main()上,但开发人员据此可以知道CPU使用率特别高,有时甚至高达100%。

3应用的CPU使用率极高时,工具Time Profiler的分析结果

要从Time Profiler获取更有用的信息,首先应反转调用树,即选择Time Profiler设置中的复选框Invert Call Tree。这样,将沿调用树从下往上(而不是从上往下)显示方法消耗的时间。除反转调用树外,取消选择复选框Hide System Libraries也很有帮助。虽然系统调用可能消耗大量的处理时间,但归根结底是由开发人员编写的代码导致的。查看系统调用通常有助于排除比较棘手的问题。根据编写代码时是否使用了Objective-C,选中复选框Show Objc-C Only可能也有所帮助。

进行合适的配置后,列表中将只有开发人员调用的方法以及这些方法占用的CPU时间。一种最佳实践是,先对启用CPU时间最多的代码进行优化,因为解决了一个大问题后,很多较小的问题常常会随之消失。要获悉代码的更详细信息,可在调用树中双击要调查的项。这将打开代码检查器,其中有一些标注,指出了各行代码的处理时间占整个方法的处理时间的百分比,如图4所示

4在按行显示Time Profiler信息

注意:
在Instruments代码检查器中,不能对代码进行编辑;但单击Xcode图标,将在Xcode中打开代码。

虽然Time Profiler没有聪明到就如何优化运行缓慢的代码提出建议的程度,但它向开发人员指明了方向。虽然并非每行代码都有优化的空间,但知道各行代码占用的处理时间后,应用优化起来就容易得多了。

提示:
使用Instruments的检查范围设置可指定要调查的时段;其中的左、右标记可用于指定检查范围的开始时间和结束时间。

3.探索Instruments:Leaks
通过结合使用工具Leaks和Allocations,开发人员可获悉大量有助于找出并解决内存问题的信息,这些问题包括过度使用内存、内存泄漏、保留循环以及其他与内存相关的问题。随着自动引用计数(ARC)的使用日益广泛,工具Leaks和Allocations渐渐地风光不在了,但依然对开发人员大有帮助。

像Time Profiler一样,也可通过工具模版列表启动Leaks。Leaks启动后,将自动添加工具Allocations,这两个工具都可在设备和模拟器上运行。在图5中,对一个性能不佳的应用进行了剖析,Allocations部分的图形表明,它占用的内存越来越多;另外,Leaks部分的红条表明,发生了多次内存泄漏。只要时间足够长,这些问题将导致应用耗尽内存进而奔溃。

调试内存问题是,虽然也可以像前一小节那样查看调用树信息,但有时查看Statistics或Leaks信息更有帮助。要查看内存泄漏信息(内存泄漏常常导致占用的内存越来越多),可选择左上角的工具Leaks。在这个示例项目中,UIImage对象泄漏了大量内存,如图6所示。

5.使用工具Leaks和Allocations剖析存在内存泄漏的项目

6.UIImage对象泄漏了大量内存,导致示例项目占用的内存越来越多
Instruments尝试基于栈跟踪归并内存泄漏,但这个系统并不完美,可能多次列出同一个问题导致的内存泄漏。具体做法是,首先解决导致内存泄漏最多的问题,然后再次对应用进行剖析。要找出导致内存泄漏的代码,需要显示右边的视图,为此可使用Instruments工具栏中的视图按钮。选择内存泄漏项,右边的视图将显示栈跟踪;然后双击非系统调用(通常显示为黑色),这将显示内存泄漏的代码。

提示:
要进一步配置工具Allocations,如启用Zombies,可单击它右边的i按钮。使用Zombies可找出并修复过度释放的问题。过度释放指的是试图访问已释放(保留计数为零)的对象,这通常会导致应用EXC_BAD_ACCESS而奔溃。

有时候,应用消耗的内存增加到了无法接受的程度,但并不存在内存泄漏。这是由于应用使用的内存超过了可用内存。要排除这种问题,可选择工具Allocations,再显示调用树信息。像前一小节一样,这里反转调用树、隐藏系统库且只显示Obj-C调用会有所帮助。在图7中,cellForRowAtIndexPath:分配了27.12MB内存,导致应用的性能不佳。双击它打开代码检查器,其中指出了消耗内存最多的代码行,为您排除问题指明了方向。

7.Allocations的调用树信息表明,cellForRowAtIndexPath:消耗了大量内存
5.更深入地了解Instruments

Instruments非常复杂,但明白基本功能和用法后,开发人员就能举一反三,轻松地使用其中的大部分工具。Apple一直在不断的改进Instruments,并敦促开发人员充分利用它。当前,Instruments提供了对应用的各个方面(从Core Data到耗电量)进行剖析的工具,还有帮助优化Core Animation和OpenGL ES动画的工具。要更深入地了解Instruments提供的工具,请参阅Apple在线文档,网址为Apple在线文档Instruments

但愿本章激发了您的热情,从此一生都醉心于最大限度地优化代码和排除微妙的bug。一个开发人员如果能够快速而高效地排除故障、优化和调试代码,就根本不用为找工作发愁,也不必担心自己对团队没有价值。

文章内容来源:
iOS组建与框架——iOS SDK高级特性剖析

猜你喜欢

转载自blog.csdn.net/baicai_520/article/details/85121444
今日推荐