iOS性能测试实战-instruments
导语iOS 性能测试入门篇,iOS 性能测试如果要做的更深入,只知道使用 instruments 或者其他的一些开源工具(如 wetest 的 perfdog )是不够的,还需要自己根据需求定制 iOS 测试工具。这里等遇到具体需求了再写。今天这篇就谈一谈我对 iOS 性能测试的理解,也是复习一下之前掌握的知识。
上篇回看 👉 :
1/ 目前 iOS 性能测试现状
讲个故事为引:一个工厂,有50条流水线,有一次老板去问一个工人,你这条流水线的成品率多少,工人说98%,老板摇了摇头,走了。后来工人问主管老板为何走了,主管说:“每条生产线都是98%,那50条流水线就是98%乘50次,基本上就是40%多,这种成品率对工厂生存都是个挑战了。”由这个故事我们可以知道,其实有的时候能争取一点就争取一点,在性能测试当中是多么的重要。目前iOS性能测试主要有两部分来优化:
a.代码层面 reivew优化
b.通过一些性能工具来帮助挖掘项目瓶颈
本文主要就性能工具的层面来阐述性能测试的一些技巧和必备知识。
2/ Instruments 的优势
Instruments 是 Xcode 的一个工具集,为我们提供了强大的程序性能分析及测试能力。Xcode是编译iOS项目时用的编译器,所以这里的兼容性问题是不用考虑的,而且Instruments是有持续维护和更新的官方工具。这就好像很少听说iOS项目不用Xcode编译器一样,工具端在iOS侧其实没有那么多的选择。读者也不必纠结一些其他工具,因为下面的介绍可以让你知道iOS的Instruments已经足够强大。
3/ Instruments 常用功能介绍
连接MAC 电脑,打开 instruments 展示如下界面:
对应上图的英文具体解释功能如下:
功能 | 具体解释 |
Blank | 创建一个空的模板,你可以自定义的添加各种工具 |
Activity Monitor | 可以只用这个模板,研究系统工作负载和虚拟内存大小的关系 |
Allocations | 将Allocations和VM跟踪器加到跟踪文档中,使用该工具可以监视内存和对象的内存分配方式和情况 |
CocoaLayout | 是一种Cocoa布局工具 ,可以应用于iOS模拟器和Cocoa桌面应用,但是不能和连接的iOS设备一起使用。观察NSLayoutConstraint对象的改变,帮助我们判断什么时间什么地点的constraint是否合理 |
Core Animation | 将CoreAnimation加入到跟踪文档中,可以测量ios设备上每秒的CoreAnimation帧数,这可以帮助你理解内容是如何渲染到屏幕上的,(图形性能)这个模块显示程序显卡性能以及CPU使用情况。 |
CoreData | 将CoreData数据提取、缓存缺失和存储加入到跟踪文档中,使用这个工具可以检测应用程序中数据的存储交互 |
Counters | 收集使用时间或基于事件的抽样方法的性能监控计数器(PMC)事件。 |
Energy Log | 耗电量监控,将Energy Diagnostics, CPU Activity, Display Brightness, Sleep/Wake, Bluetooth, WiFi, and GPS instruments加入到跟踪文档中进行检测。 |
File Activity | 将File Activity, Reads/Writes, File Attributes, and Directory I/O instruments 加入到跟踪文档中,只用这个模板可以让你检查系统文件的使用情况,可以检查文件的打开、关闭、读和写操作,同时也可以检测文件系统本身的改变,包括权限和所有权发生的改变。 |
Leaks | 将the Allocations and Leaks instruments加入到模板中,使用这个模板可以帮助你检测内存的泄漏。 |
Metal System Trace | 它是是apple 2014年在ios平台上推出的高效底层的3D图形API,它通过减少驱动层的API调用CPU的消耗提高渲染效率。 |
Network | 用链接工具分析你的程序如何使用TCP/IP和UDP/IP链接。 |
OpenGL ES Analysis | 将OpenGL ES Analyzer and OpenGL ES Driver加入到模板中,这个模块测量分析OpenGL ES活动正确性检测以及表现问题,提供解决建议。 |
System Trace | 系统跟踪,通过显示当前被调度线程提供综合的系统表现,显示从用户到系统的转换代码通过两个系统调用或内存操作。 |
System Usage | 这个模板记录关于文件读写,sockets,I/O系统活动, 输入输出。 |
Time Profile | 执行对系统的CPU上运行的进程低负载时间为基础采样。 |
Zombies | 测量一般的内存使用,专注于检测过度释放的野指针对象,也提供对象分配统计,以及主动分配的内存地址历史。 |
这里常用工具主要有:Activity Monitor, Allocations,Core Animation,Leaks 在下一节当中也重点介绍下是在项目中如何使用Instruments的这几个功能发现问题的。
4/ Instruments 实战操作举例(上)
以一个 app性能需求测试 为例,以下简称 APP 小A,介绍几个关于音视频相关的性能测试 case。
(1)业务视频合成页面-帧速 FPS 测试
- 需求:针对 APP 小 A 编辑视频的页面帧率进行专项测试,通过提高预览时的 FPS,来提高用户制作的欲望
- 具体使用到的工具:适用instruments 的 core animation 来测试 FPS
(2)具体操作
具体操作的页面:
可以看到,图中界面下方是有 fps 滚动的。按照这个方法测试几款机型,拿到详细的数据结果。
注意:在做性能测试的时候,要从功能测试的角度来分析。即业务侧:
问题 1:用户滑动的时候是怎么滑的?(快速刷,慢刷)
问题2:用户滑动的时候,看到的是视频,还是图?(feed加载不同内容的时候性能变化)
问题3:快速滑动的时候数据加载问题,是否有优化空间?
根据上述3个问题,再根据具体操作来逐个获得数据,最后发现与竞品的数据对比如下:
(3)测试结论与原因分析
下面给几个性能测试的结论样例,方便各位同学参考:
(a)竞品对比结论(样例)
快速滑动的时候,竞品帧率非常稳定的原因有如下几个:
- 对于快速的 UIKit 有优化空间,异步的动作与主进程分开,保证主进程的性能。
- 分页逻辑需要更加细腻,在分页数据不够时,增加缓冲条 UI,不让用户不停的向下滑
对于慢滑时帧率过高的原因分析:
慢滑的时候一直能保持高 FPS 的原因可能是因为在“持续播放视频”,视频的帧率可以保持在 60FPS 不掉,所以让 feed 的帧率也会保持在 60FPS 不掉。但是竞品的 feeds 没有播放逻辑,所以节约了这块的性能支出。展示的内容少,就算帧率低,慢滑的时候感官体验也不会太差。但是在快速滑动的时候,APP-A 就能明显感受到卡顿
(b)多机型测试详细结论(样例):
iPhone6 :
可以看到有很多低于20fps的帧率表现 这些时刻基本上都是seek,在fps为0的特殊时候,可以看到当时cpu的监控 cpu并没有跑到峰值,因此这里可能有优化的空间 |
iPhone7P:
iPhone7p在seek的时候数据表现较好,尤其在频繁seek,切换主题的时候可以看到帧率并没有掉的很厉害,cpu的利用率也没有到达峰值 |
iPhoneX:
iPhoneX机型在seek 切换主题,正常预览播放的时候fps都表现优异,没有出现掉帧,也没有出现fps低于30的情况 |
至此,基于 iOS 性能测试的-FPS 帧率测试的场景就基本上测试完了,我觉得工具其实是次要的,主要还是在做性能测试的时候的思考和猜想验证比较重要。平时要多锻炼这方面的能力,才能快速帮忙定位业务问题。
往期文章推荐:
👉
👉
👉
👉
如果您喜欢,能点个“在看”吗?您的“在看”是我最大的动力,感谢您!
测试先锋:积跬步,至千里,做踏踏实实技术人✌️