使用Instruments查找slow code

由donnywals于2019年12月8日发布
我们偶尔会遇到性能问题。 发生这种情况时,您可以做的一件事是测量代码中某些内容花费的时间。 您可以使用路标来做到这一点。 但是,有时我们需要对代码有更深入的了解。 更具体地说,有时您只是想确切知道代码中每个函数执行所需的时间。 您可以使用Time Profiler工具获得这些见解。 在今天的文章中,我将向您展示如何使用Time Profiler分析代码,以及如何优化其输出,以便获得有价值的见解。

 

探索Time Profiler Instrument

如果要分析您的应用程序,则需要运行它进行性能分析。 您可以通过按cmd + i或使用产品->配置文件菜单项来执行此操作。 应用编译完成后,它将安装在您的设备上,然后仪器将启动。 在启动Instruments时出现的窗口中,选择Time Profiler模板(Leaks和Allocations模板的使用位于:《iOS开发中的神兵利器》第10章第22、23节):

Instruments template selection

选择此模板后,Instruments将启动一个新的具有多个轨道的Instruments会话。

Empty Instruments window

您最感兴趣的是Time Profiler轨道。 当您选择Time Profiler轨道时,Instruments时间轴下的表格将显示您的应用程序的对象及其方法,以及每种方法花费的时间。 要分析您的应用,请解锁您的设备,然后点击左上角的“录制”按钮。 像平常一样使用应用程序,并确保花一些时间使用最感兴趣的功能。仪器将开始填充代码中的测量结果,如以下屏幕截图所示。Instruments with measurements

Time Profiler每隔几毫秒对应用程序的内存和CPU使用情况进行一次快照,以创建运行时间和时间的图片。 基于此,Time Profiler会测量每种方法花费了多少时间。 不利的一面是,Time Profiler不适合对代码进行细粒度的高分辨率分析。 如果这是您所需要的,则应改为使用路标。

Note如果要在其上运行Time Profiler,最好始终在真实设备上运行您的应用程序。 模拟器具有工作计算机的所有处理能力,因此如果您使用模拟器对应用程序进行配置,则测量结果将非常不准确。

一旦感觉到您已捕获到足够的数据来处理,就可以开始分析测量值了。

分析 Time Profiler's measurements

默认情况下,Instruments将由内而外显示其测量结果。 树中最顶层的项目是您的应用程序,后跟多个线程。 注意仪器如何显示每个线程花费的秒数。 仅当您的应用正在积极处理相应线程上的数据时,此计数器才会递增。 由于您可能对从内而外的工作方式以及系统库中的工作方式都不感兴趣,因此最好更改仪器可视化数据的方式。 在窗口底部,有一个名为``调用树''的按钮,如果单击该按钮,则可以指定仪器应如何显示其测量值。 我总是使用以下设置:

Instruments settings

从表面上看,似乎没有太大变化。 您的代码仍然被线程分开,但是如果您扩展线程,则代码将首先列出,因为现在是从外向内而不是从内向外显示调用树。 每次您深入钻研一个级别,Instruments都会显示您正在钻研的方法。

在我一直在此处进行分析的应用程序中,我一直在寻找导致图像下载完成后花很长时间来更新UI的原因。 我可以看到我的performTask方法花费了很多时间。 这是负责获取和处理图像并将其最终传递给UI的方法。 UIImage初始化器也花了一些时间。 从performTask方法中调用该方法,如以下屏幕快照所示:

Instruments readout

根据这些发现,您可以得出结论,因为我们将所有时间都花在了PerformTask上,所以可能会发生一些麻烦的事情。 如果UIImage的初始化很慢,我们将在该初始化程序上花费更多的时间。 而且由于代码在performTask中花费了很多时间,而不是在UIImage初始化器中花费了很多时间,因此这是一个很好的第一选择。

在这种情况下,我故意降低了performTask的速度。 加载图像后,我会几次将其写入手机的文档目录,并在更新UI之前将其转换为UIImage一次,而不是五次。 在这种情况下,可能的解决方法是在将图像持久保存到文档目录之前立即更新UI,并删除显然不需要的循环。

总结

根据个人经验,我可以告诉您,Time Profiler乐器是iOS开发人员工具箱中非常有价值的工具。 如果您的用户界面没有按照您希望的那样平滑滚动,或者您的设备在每次使用应用程序时都运行在高温状态,或者看到Xcode中的CPU和内存使用率一直在上升,那么Time Profiler可以极大地帮助您了解 您的代码在做什么。 当您对代码进行概要分析并了解正在发生的情况时,您可以更加自信地开始研究代码中的性能问题。

译自:https://www.donnywals.com/finding-slow-code-with-instruments/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值