instrument的使用(iOS使用Instruments分析和优化CPU性能问题)

本文目录
- iOS使用Instruments分析和优化CPU性能问题
- 单词instrument和tool作为“工具,手段”解时,用法有什么区别 请举例说明哦,谢谢~
- 使用instrument检测内存泄漏Target failed to run: Permission to debug *** was denied.
- equipment用is还是are
- instrument用法冠词
iOS使用Instruments分析和优化CPU性能问题
背景
前不久我做了一个富文本工具,器遇到了一个性能问题是添加多张图片,当滚动区域,遇到图片切换的时候会有明显的卡顿现象。这篇文章基于这个卡顿的性能问题进行性能瓶颈的分析以及做对应的优化。
可以打开这个链接 iOS使用UITableView实现的富文本器 查看我的文章,这篇文章所用的项目也是基于这个项目的。
结果
最终的分析优化的结果把时间从90ms的数量级降低到了2ms的数量级,达到了一个比较流畅的效果。具体的分析优化步骤请往下看。
问题分析
既然问题是发生在图片切换的时候,图片是放在单独的一个Cell中的,那么就尝试在Cell的渲染方法 cellForRowAtIndexPath 添加两个Log,查看方法执行所用的时间。
对应的结果:
从日志打印的时间上看,大概每渲染一个Cell只要发几毫秒的时间,貌似问题不会出现在这个位置,然而这并不是真相,很明显的,其他地方不会影响到,所以得用更高级的分析工具去分析查看。
发现问题
Instrument是一个很好的性能分析工具,可以分析内存分配、内存泄漏、网络情况、CPU占用等和性能有关的问题,当前的性能问题是耗时的问题,可以使用 Instrument 的 Time Profiler 进行分析
让这个列表滚动,并且有进行图片Cell的切换
可以看到Time Profiler 有下面的记录,红色框中就是Cell切换所耗费的时间值,这个时间的增长很明显的高于其他值了,所以这个就是我们要定位到的地方了。
Tips
alt + 鼠标滚轮 -》 缩放时间轴
shift + 鼠标滚轮 -》 移动时间轴
按住鼠标框选 -》 选择和定位时间轴
第一步要在时间轴上框选一个范围,标识选择这个范围进行分析,才能准确定位到这个问题,如图(1)位置所示;第二步要选在堆栈中的某一个函数,一般的选择到OC函数调用,更底层的函数调用就到了CF层是C语言实现的就不好分析了,所以这里选择的是 这个函数分析,可以看到这个函数调用说花费的时间是 92ms,这是一个比较长的时间了,所以应该就是这里导致的卡顿了。
这个函数花费的时间和image图片的大小有关系的,选择另一个时间峰值范围,这个时间峰值范围是发生在小图之间的切换的
这个地方耗费的时间就比较小一点,不过也是达到了25ms,对于性能也是有一定的影响的。
解决问题
以上的分析可以得出结论: 函数绘制图片实现的。
既然是UITextView内部的处理方式,所以这个函数调用行为是应用层改变不了的,不过UIImage对象是我们可以控制的,或者可以改变图片的显示方式来达到优化的目的,所以就有了以下的两种方案。
方案1
第一种方案就是对预览的图片进行压缩,然后再设置到NSTextAttachmen中,放到UITextView中显示
这样修改之后大图的滚到加载时间减少到了40ms左右
虽然减少了一半的时间,不过,40ms的时间还是比较长的,下面会继续进行优化。
方案2
上面的方案进行了图片的压缩,时间的耗费还是因为 函数的调用,所以有没有一种更好的方案呢?答案是肯定的,可以把传给UITextView的image压缩成一个很小的,(这一步也可以不必,传递一个空的UIImageView对象即可,这里设置图片的主要原因是图片区域需要一个的光标),然后在 UITextView 所对应的图片区域添加一个UIImageView,在UIImageView中设置原始的图片即可,这种方案会比方案1的效果好很多。
方案二几个修改点:
设置NSTextAttachment的image为空的UIImage对象
Cell添加ImageView显示Image
下面是使用方案2优化之后的分析图
图中可以看到 cellForRowAtIndexPath 方法总共占用了2ms的时间,从分析的堆栈中可以看到 UITextView setAttributedText: 方法才占用了1ms的时间,所以这个提升是很明显的,因为传递了一个空的UIImageView对象,不用执行 方法调用的时间。
总结
Instrument是一个很好工具,你用它可以很方便的帮我们定位到性能问题,问题找到了,那么也就很容易找到解决方案了。
单词instrument和tool作为“工具,手段”解时,用法有什么区别 请举例说明哦,谢谢~
一般人应该都说不出区别,基本上混用的,我理解,大词比小词(instr和tool)的工具复杂科技一点,tool工具简单一点,所以有的说是手工工具,至于有的说tool可以引申用,不足为据,难道大词就不能引申用?有的举例use writing as a tool of learning ,an instrument of learning都有用的,所以出这种区分题的人应该是不懂现代语言现实的老古板,非要区别的话,个人意见觉得小的有形大的无形,但不敢绝对化,只能具体语境凭语感aaaaaaaaa
使用instrument检测内存泄漏Target failed to run: Permission to debug *** was denied.
更新xcode 9之后,打开instrument调试应用时发现提示 Target failed to run: Permission to debug ****** was denied 而无法进行下去。
在xcode状态栏-》Product-》Scheme-》Edit Scheme,打开如下画面:
改成Debug模式后,重启xcode,如果不起作用,就重启电脑。
再次打开就可以愉快的使用instrument做你想做的事情啦~
equipment用is还是are
equipment用is。因为equipment是不可数名词,所以对应的要用is。
equipment释义:
n.设备,用具;(对某人或某物的)装备过程;(做某事应具备的)素质,才能
短语:
medical equipment 医疗器械;医疗仪器
radio equipment 无线电没备
Cryo Equipment 低温装置;低温设备;低温装备;低温装配
词语辨析:
facility, equipment, instrumentfacility n.指较大的设施、设备,尤指公用的、为大众带来便利的设备。
equipment n.指生产、研究所需要的设备、装置,如各种机器和器材,是不可数名词。
a factory with modern equipment具有现代化设备的工厂
instrument n.乐器,仪器,为某个用途而使用的工具。
As a flexible actor, he can perform, sing, dance and play several kinds of musical instruments.作为一个多才多艺的演员,他既可以表演,又会唱歌跳舞,还能够演奏不同种类的乐器。
instrument用法冠词
instrument
n.仪器;乐器;工具;器械
v.用器械(或仪器)装备;向…提交文书
1. A woodwind instrument having a straight,
cylindrical tube with a flaring bell and a single-reed mouthpiece, played by
means of finger holes and keys.
单簧管,黑管一种管乐器,有直的圆筒形管身和一个外敞的管口及一个单簧吹口,以指孔和键的方式演奏
2. The seller guarantees that the instrument
contract for will be made of the best material with first-class workmanship.
卖方保证合同中订购的仪器是以第一流的工艺和最好的材料制造的。
3. Musical Instrument Digital Interface, or MIDI, is a
communication interface provided on virtually every synthesizer made today.
音乐设备数字接口,或称MIDI, 实际上是为目前制造的各种合成器提供的一种通信接口。
4. The viola is a stringed instrument.
中提琴是一种弦乐器。
5. A virtuoso is one who is expert in playing a musical
instrument.
音乐大师是指在演奏某乐器方面是专家的人
6. An optical instrument that uses a lens or a
combination of lenses to produce magnified images of small objects, especially
of objects too small to be seen by the unaided eye.
显微镜用一个透镜或一些透镜的组合来制造小物体的放大形像的视力工具,通常用来观察肉眼看不到的物体

更多文章:
form表单制作(为什么制作的form表单会在网页显示中多出一行)
2026年10月11日 09:10
teammate(teammate,company,partner)
2026年10月11日 06:10
javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)
2026年10月11日 04:00
text函数公式(excel中round和text函数的区别是什么)
2026年10月11日 03:50
google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)
2026年10月11日 02:00
websocket整合springboot(Springboot整合Websocket遇到的坑)
2026年10月11日 01:40
drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)
2026年10月10日 19:20
xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)
2026年10月10日 17:50




