Instrument的使用

本文详细介绍如何使用Xcode内置工具TimeProfiler、CoreAnimation和Leaks进行性能分析。包括检测CPU使用情况、评估图形性能及查找内存泄露的具体步骤。
部署运行你感兴趣的模型镜像

可以看到 Instruments 功能很多,这里先介绍一下我们在开发中常用到的几种:CPU 性能测试、图形性能测试、内存性能测试。本文主要介绍Time Profiler、Core Animation、Leaks的简单实用。

工具通过Xcode工具栏中Product->Profile(command+i)可以启动,启动后界面如下:
这里写图片描述
在开始进行应用程序性能分析的时候,建议使用真机测试,数据会更可靠。毕竟模拟器运行在Mac上,Mac上的CPU和手机的CPU是不一样的。
应用程序运行一定要发布配置 而不是调试配置。

###1.Time Profiler 时间分析工具
用来检测应用CPU的使用情况.可以看到应用程序中各个方法正在消耗CPU时间。
这里写图片描述

1.选择 Time Profiler,并点击 Choose按钮。
2.选择正确的设备和应用程序
3.点击红色按钮运行后,就能得到 CPU 性能的结果
4.勾选右边Call Tree中Separate Thread和Hide System Libraries两个选项后,可以看到对应的代码执行耗时
这里写图片描述

5.双击方法,可以看到代码详情

这里写图片描述

其中[dateDetector matchesInString]耗时是122x,x既耗时单位这里为ms毫秒.当然如果直接在Instrument找到问题觉得不方便修改,可以直接点击右上方Xcode按钮会直接定位Xcode对应调用方法入口.这样很容易能够快速定位代码占用CPU最多的方法.也可以打开Xcode快速修改并重新运行Profile来看修改后耗时前后对比.简单便捷。

####这里对右侧call tree选项有必要做一下说明[官方user guide翻译]:

  • Separate By Thread

    线程分离,只有这样才能在调用路径中能够清晰看到占用CPU最大的线程.

  • Invert Call Tree

    从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时,比如FuncA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面.

  • Hide Missing Symbols

    如果dSYM无法找到你的APP或者调用系统框架的话,那么表中将看到调用方法名只能看到16进制的数值,勾选这个选项则可以隐藏这些符号,便于简化分析数据.

  • Hide System Libraries

    这个就更有用了,勾选后耗时调用路径只会显示app耗时的代码,性能分析普遍我们都比较关系自己代码的耗时而不是系统的.基本是必选项.注意有些代码耗时也会纳入系统层级,可以进行勾选前后前后对执行路径进行比对会非常有用.

2.Core Animation

评估图形性能

这里写图片描述

1.选择 Core Animation,并点击 Choose按钮。
2.选择正确的设备和应用程序
3.点击红色按钮运行后,随着我们操作 App,就能得到数据

这里写图片描述

在右下角面板的 Settings 区域,我们可以看到多个 Debug Options:

注:xcode9.3以后,debug Options在路径为:Xcode->Debug->View Debugging->Rendering中选择

  • 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

     这个选项会把重绘的内容显示为黄色。不该出现的黄色越多,性能越差。通常我们希望只是更新的部分被标记完黄色。
    

###3.Leaks
这里写图片描述

1.选择 Leaks,并点击 Choose按钮。
2.选择正确的设备和应用程序
3.点击红色按钮运行后,随着我们操作 App,就能得到数据

这里写图片描述

4.可在下图这个位置选择,展示的不同模式

这里写图片描述

5.在Call Trees模式下,在Settings 中勾选 Invert Call Tree 或 Hide System Libraries,或其他选项可以过滤显示的数据。

6.出现内存泄露的情况

这里写图片描述

7.选中上图的Leak Checks 一栏
8.然后点击导航栏切换到“Call Tree”模式

这里写图片描述

9.勾选右边的详细窗口 Display Settings中的 Call Tree中 Separate by Thread和 Hide System Libraries两个选项,Hide System Libraries作用是隐藏系统函数。能方便的看到程序中代码所在的位置。

10.勾选之后,双击一下就会来到内存泄漏的地方

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

在IT领域,“instrument”主要有“检测”“监测”以及“插桩”等含义,以下是详细介绍及应用场景: ### 含义 - **检测、监测**:作为动词时,“instrument”可理解为对系统、软件、网络等进行检测和监测,以收集性能、状态等相关数据。作为名词时,“instrument”有仪器、工具的意思,代表用于监测和测量的工具或软件。 - **插桩**:在软件开发里,“instrument”还有插桩的意思。插桩是指在源代码中插入额外的代码段,用于收集程序运行时的信息,如函数调用次数、变量值的变化等。 ### 应用 - **性能监测** - **服务器性能**:借助监测工具对服务器的CPU、内存、磁盘I/O、网络带宽等指标进行监测,及时察觉性能瓶颈与异常,保证服务器稳定运行。像Zabbix、Nagios这类工具,就能实时收集服务器的各项性能数据,并在出现问题时发出警报。 - **应用程序性能**:针对应用程序的响应时间、吞吐量、错误率等指标进行监测,从而优化应用程序的性能。例如New Relic、AppDynamics等应用性能管理(APM)工具,可深入到应用程序内部,分析各个组件的性能表现。 - **安全监测** - **网络安全**:利用入侵检测系统(IDS)和入侵防御系统(IPS)对网络流量进行监测,及时发现并阻止潜在的网络攻击。例如Snort,可对网络数据包进行实时分析,检测出各种恶意攻击行为。 - **系统安全**:通过对系统日志、用户行为等进行监测,发现异常活动和安全漏洞。例如OSSEC,能对系统文件的完整性、登录记录等进行监测,及时发现系统被入侵的迹象。 - **软件开发中的插桩** - **代码调试**:在代码中插入插桩代码,输出变量值、函数调用顺序等信息,帮助开发人员快速定位和解决问题。例如在Python代码中插入打印语句来输出变量的值。 ```python def add(a, b): result = a + b print(f"a = {a}, b = {b}, result = {result}") # 插桩代码,用于调试 return result add(1, 2) ``` - **代码覆盖率分析**:通过插桩技术统计代码的执行情况,确定哪些代码被执行过,哪些代码未被执行,从而评估测试用例的覆盖率。例如在Java开发中,可使用JaCoCo工具进行代码覆盖率分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值