IOS使用Instrument-Time Profiler工具分析和优化性能问题

本文讲的是IOS使用Instrument-Time Profiler工具分析和优化性能问题,前不久我做了一个富文本编辑工具,编辑器遇到了一个性能问题是添加多张图片,当滚动编辑区域,遇到图片切换的时候会有明显的卡顿现象。这篇文章基于这个卡顿的性能问题进行性能瓶颈的分析以及做对应的优化。

可以打开这个链接 iOS使用UITableView实现的富文本编辑器 查看我的文章,这篇文章所用的项目也是基于这个项目的。

结果

最终的分析优化的结果把时间从90ms的数量级降低到了2ms的数量级,达到了一个比较流畅的效果。具体的分析优化步骤请往下看。

问题分析

既然问题是发生在图片切换的时候,图片是放在单独的一个Cell中的,那么就尝试在Cell的渲染方法 cellForRowAtIndexPath 添加两个Log,查看方法执行所用的时间。

对应的结果:


  1. 2017-08-11 06:12:48.744 RichTextEditDemo[6867:1064632] ======begin render cell 
  2.  
  3. 2017-08-11 06:12:48.749 RichTextEditDemo[6867:1064632] ======end render cell 
  4.  
  5. 2017-08-11 06:12:49.261 RichTextEditDemo[6867:1064632] ======begin render cell 
  6.  
  7. 2017-08-11 06:12:49.266 RichTextEditDemo[6867:1064632] ======end render cell  

从日志打印的时间上看,大概每渲染一个Cell只要发几毫秒的时间,貌似问题不会出现在这个位置,然而这并不是真相,很明显的,其他地方不会影响到,所以得用更高级的分析工具去分析查看。

发现问题

Instrument是一个很好的性能分析工具,可以分析内存分配、内存泄漏、网络情况、CPU占用等和性能有关的问题,当前的性能问题是耗时的问题,可以使用 Instrument 的 Time Profiler 进行分析

让这个列表滚动,并且有进行图片Cell的切换

可以看到Time Profiler 有下面的记录,红色框中就是Cell切换所耗费的时间值,这个时间的增长很明显的高于其他值了,所以这个就是我们要定位到的地方了。

Tips

  • alt + 鼠标滚轮 -> 缩放时间轴
  • shift + 鼠标滚轮 -> 移动时间轴
  • 按住鼠标框选 -> 选择和定位时间轴

第一步要在时间轴上框选一个范围,标识选择这个范围进行分析,才能准确定位到这个问题,如图(1)位置所示;第二步要选在堆栈中的某一个函数,一般的选择到OC函数调用,更底层的函数调用就到了CF层是C语言实现的就不好分析了,所以这里选择的是 [UIImage drawInRect:blendMode:alpha] 这个函数分析,可以看到这个函数调用说花费的时间是 92ms,这是一个比较长的时间了,所以应该就是这里导致的卡顿了。

这个函数花费的时间和image图片的大小有关系的,选择另一个时间峰值范围,这个时间峰值范围是发生在小图之间的切换的

这个地方耗费的时间就比较小一点,不过也是达到了25ms,对于性能也是有一定的影响的。

解决问题

以上的分析可以得出结论:[UIImage drawInRect:blendMode:alpha] 函数的调用是会导致性能问题的,因为UITextView内部处理图片的方式是通过调用 [UIImage drawInRect:blendMode:alpha] 函数绘制图片实现的。

既然是UITextView内部的处理方式,所以这个函数调用行为是应用层改变不了的,不过UIImage对象是我们可以控制的,或者可以改变图片的显示方式来达到优化的目的,所以就有了以下的两种方案。

方案1

第一种方案就是对预览的图片进行压缩,然后再设置到NSTextAttachmen中,放到UITextView中显示


  1. textAttachment.image = self.image; 
  2. // ===> 修改为 
  3. // scaletoSize用于压缩原始的图片,textAttachment中的image对象是压缩过后的 
  4. textAttachment.image = [self.image scaletoSize:showImageWidth];  

这样修改之后大图的滚到加载时间减少到了40ms左右

虽然减少了一半的时间,不过,40ms的时间还是比较长的,下面会继续进行优化。

方案2

上面的方案进行了图片的压缩,时间的耗费还是因为 [UIImage drawInRect:blendMode:alpha] 函数的调用,所以有没有一种更好的方案呢?答案是肯定的,可以把传给UITextView的image压缩成一个很小的,(这一步也可以不必,传递一个空的UIImageView对象即可,这里设置图片的主要原因是图片区域需要一个编辑的光标),然后在 UITextView 所对应的图片区域添加一个UIImageView,在UIImageView中设置原始的图片即可,这种方案会比方案1的效果好很多。

方案二几个修改点:

1.设置NSTextAttachment的image为空的UIImage对象


  1. //.... 
  2.     NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init]; 
  3.     CGRect rect = CGRectZero; 
  4.     rect.size.width = showImageWidth; 
  5.     rect.size.height = showImageHeight; 
  6.     textAttachment.bounds = rect; 
  7.     textAttachment.image = [UIImage new]; 
  8.  
  9.     NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:textAttachment]; 
  10.     //....  

2.Cell添加ImageView显示Image


  1. [self.imageContentView mas_remakeConstraints:^(MASConstraintMaker *make) { 
  2.     make.left.equalTo(self).offset(_imageModel.imageFrame.origin.x); 
  3.     make.top.equalTo(self).offset(_imageModel.imageFrame.origin.y); 
  4.     make.height.equalTo(@(_imageModel.imageFrame.size.height)); 
  5.     make.width.equalTo(@(_imageModel.imageFrame.size.width)); 
  6. }]; 

下面是使用方案2优化之后的分析图

图中可以看到 cellForRowAtIndexPath 方法总共占用了2ms的时间,从分析的堆栈中可以看到 UITextView setAttributedText: 方法才占用了1ms的时间,所以这个提升是很明显的,因为传递了一个空的UIImageView对象,不用执行 [UIImage drawInRect:blendMode:alpha] 方法,使用了UIImageView直接设置Image的方式几乎不会占用时间,所以堆栈中看不到 [UIImageView setImage:] 方法调用的时间。

总结

Instrument是一个很好工具,你用它可以很方便的帮我们定位到性能问题,问题找到了,那么也就很容易找到解决方案了。

本文作者:aron1992

来源:51CTO

原文标题:IOS使用Instrument-Time Profiler工具分析和优化性能问题

时间: 2024-10-28 22:07:57

IOS使用Instrument-Time Profiler工具分析和优化性能问题的相关文章

SQL Server Profiler工具

原文:SQL Server Profiler工具 一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问题: 调试T-SQL语句: 模拟重放SQL Server活动: 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动.这样的活动被称为Profiler跟踪. 1.Profiler跟踪 从开始=>所有程序=>Microsoft

《iOS取证实战:调查、分析与移动安全》一2.5 与iTunes的交互

2.5 与iTunes的交互 用户可通过iTunes提供的各种功能来管理iPhone设备上的文件.应用程序.软件版本等.下面将讨论iTunes的主要特性. 2.5.1 设备同步 当iPhone连接到iTunes后,用户可启动iTunes软件与设备进行同步.根据用户的设置,这个过程将存储在iTunes上的所有应用程序.音乐.视频和图片等加载到设备上.在同步过程中,iTunes上的数据是优先的,设备上任何与iTunes不同的数据都会被删除.用户可以设置iTunes在每次设备连接时自动同步,或者设置必

iOS 安全之针对 mach_portal 的分析

iOS 安全之针对 mach_portal 的分析     一. 背景 Google Project Zero的Ian Beer在12月中旬放出了在iOS 10.*上获取root shell的利用代码,意大利的Luca在此基础上添加了KPP绕过,实现了iOS 10.*的越狱.本文将结合mach_portal的源码对其利用的三个漏洞进行分析,并对每一个步骤进行说明. mach_portal利用的漏洞都源于XNU内核对Mach Port的处理不当,相信这也是mach_portal名称的由来.XNU内

用Python编写分析Python程序性能的工具的教程_python

虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 分析程序的性能可以归结为回答四个基本问题:     正运行的多快     速度瓶颈在哪里     内存使用率是多少     内存泄露在哪里 下面,我们将用一些神奇的工具深入到这些问题的答案中去.用 time 粗粒度的计算时间 让我们开始通过使用一个快速和粗暴的方法计算我们的代码:传统的 unix time 工具.   $ time pyth

站长们常用的seo查询工具分析

  每个站长在做站的过程中都会使用一些seo查询工具,无论是分析竞争对手的网站或者其他方面的网站,或者是用来查询网站的收录.关键词排名.外链.友情链接等情况,用工具辅助查询,不仅方便快捷,还能对各种数据进行可视化的分析查询,避免不必要的时间浪费,百度一下"站长工具",可搜索到各式各样的站长查询工具,看着如此多的seo工具,选择上就有点困难了. 我每天工作的第一件事就是先查看网站的整体情况,在做优化期间也尝试了不同的查询工具,但到头来用着顺手.比较合自己眼缘也就那几款,现在各大搜索引擎相

Win8如何借助工具分析蓝屏故障文件Memory.dmp

  如何借助BlueScreenView工具分析蓝屏故障原因呢? 具体方法如下: 1.右击BlueScreenView.exe程序,选择"以管理员身份运行"; 2.若你的电脑有蓝屏过,且蓝屏文件没有被清理掉,则这里应该会自动列出蓝屏记录文件; 3.其中默认最上面的记录文件是最新的蓝屏故障,点击最上面的记录文件,通过后面的参数大概了解到问题原因; 4.双击其中一个蓝屏记录文件可以在弹出的新窗口中详细显示此次蓝屏故障参数; 5.前提是你电脑有启用事件日志记录功能.

利用开源工具分析新型PowerPoint恶意文档

本文讲的是利用开源工具分析新型PowerPoint恶意文档,最新新出现了一个新型的恶意MS Office文档:通过将鼠标光标悬停在链接上来执行PowerShell命令的PowerPoint文档,此攻击不涉及VBA宏.在本博客中,我们将展示如何使用免费的开源工具分析这些文档.像往常一样,该恶意MS Office文件通过电子邮件发送给受害者. 分析 使用emldump.py(一个分析MIME文件的工具),我们可以分析用户收到的电子邮件: 输出表示邮件附件位于第5部分.我们选择第5部分,并执行前100

ios-开发iOS应用最好的IDE工具是什么?最好是免费开源的。

问题描述 开发iOS应用最好的IDE工具是什么?最好是免费开源的. 我是个Java开发者,熟悉的IDE工具有Eclipse和NetBeans, 现在想尝试iOS开发,想知道用Object C开发iOS程序,什么IDE工具最好用? 解决方案 xcode,现在是免费的 解决方案二: 毫无疑问是xcode,免费但不开源 解决方案三: Xcode...而且要不停升级 其他的,没有接触过 解决方案四: xcode~~~~免费还是比较好用的~~~~~

[iOS] 新手求助~xcode工具条运行按钮后面 有一行选择项 为什么不见了呢?

问题描述 [iOS] 新手求助-xcode工具条运行按钮后面 有一行选择项 为什么不见了呢? 小弟最近刚学ios开发 ,看了老师的视频,在学xcode的时候 发现工具条运行按钮后面 有一行选择程序运行平台 >My Mac 字样的选择项,可是自己的xcode 工具栏上却没这个选择项,请问是为什么呢?求xdjm们解答,万分感谢了! 解决方案 查看view等这是否取消了 解决方案二: view具体哪一项呢?