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工具分析和优化性能问题
相关文章
|
24天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
18 1
|
26天前
|
Dart 数据安全/隐私保护 Swift
iOS代码混淆工具推荐:IPA Guard详细介绍
iOS代码混淆工具推荐:IPA Guard详细介绍
42 0
|
28天前
|
移动开发 安全 数据安全/隐私保护
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
34 4
|
3月前
|
移动开发 前端开发 安全
最强大的 iOS 应用源码保护工具:Ipa Guard,保护你的商业机密代码
最强大的 iOS 应用源码保护工具:Ipa Guard,保护你的商业机密代码
|
3月前
|
JSON 前端开发 数据安全/隐私保护
【教程】iOS 手机抓包工具介绍及教程
📱 最近又发现APP Store一款宝藏软件,克魔助手抓包工具,app刚上架,功能不断迭代中,目前18软妹币实惠价可享受终身版!现在是下手的最好时机。
|
26天前
|
Linux iOS开发 开发者
ios ipa包上传需要什么工具
ios ipa包上传需要什么工具
24 0
|
2月前
|
安全 搜索推荐 Android开发
Android 与 iOS 的比较分析
【2月更文挑战第5天】 Android 和 iOS 是目前市场上两种最流行的移动操作系统,它们都拥有自己的特点和优势。本文将会分别从操作系统设计、应用生态、安全性等方面对这两种操作系统进行比较和分析,希望能够帮助读者更好地选择适合自己的移动设备。
|
2月前
|
Linux Android开发 iOS开发
iOS 应用上架的步骤和工具简介
APP开发助手是一款能够辅助iOS APP上架到App Store的工具,它解决了iOS APP上架流程繁琐且耗时的问题,帮助跨平台APP开发者顺利将应用上架到苹果应用商店。最重要的是,即使没有配置Mac苹果机,也可以使用该工具完成一系列操作,包括iOS证书申请、创建iOS开发者证书和 iOS发布证书等各类证书。此外,在Windows、Linux或Mac系统中上传IPA到App Store也变得简单快捷,从而大大简化了iOS APP上架的流程。
|
2月前
|
编解码 Android开发 iOS开发
iOS 上架审核宝典:注意事项与实用工具分享
iOS 上架审核宝典:注意事项与实用工具分享