APP要做
性能测试,什么样的数据能反应应用的性能情况,如何评估应用的性能状态?不知道该如何入手?一起来分析下如何给APP做性能测试。
性能测试三角:性能指标、测试场景、测试工具。
首先要思考选哪些指标来评估性能:内存、cpu、电量还是什么?接着,选择你需要测试的场景,测试场景描述了你需要在何种场景下取性能数据,要测试APP何种功能等等。最后,根据你的指标和场景选择适合你的测试工具。
下面就从这三方面来具体分析。
一、性能指标
常见的性能指标有:内存、CPU、电量、流量、速度/耗时。这里从2个角度分析:
(1)为什么选这个指标?
(2)指标常用单位有哪些?
着重讲下关注最多的:内存、CPU。
1、内存
为什么要选内存呢?需要知道
Android的OOM和Low Memory Killer。
OOM:Out Of Memory,顾名思义是说内存不够用或者耗尽了,进程会被强制终止。安卓框架限制了每个应用进程所占用的最大内存值。关注内存的一个目的就是避免内存使用过大,出现OOM。主要关注内存使用较多时的场景,例如游戏app正在游戏中。
Low Memory Killer:Low Memory Killer在用户空间中指定了一组内存临界值,当其中的某个值与进程描述中的oom_adj值在同一范围时,该进程将被Kill掉。如果你的APP某个进程需要一直保存存活,你需要保持你的进程优先级足够高,并且占用比较小,因为Low Memory Killer在
工作时,同一优先级的进程会先kill那个占用最大的。性能测试时主要关注待机时的内存是不是够小。
这里再补充一点:Low Memory Killer的工作可能致系统变卡。为什么呢?因为它kill了一些进程,然而现在市面的很多APP为了保活都会自启,刚刚被kill,立刻又起来。启动占用大量内存(还有CPU),又触发Low Memory Killer。频繁的被kill和启动形成了恶性循环,so…系统变的很卡。
内存指标有VSS、RSS、PSS、USS。差别如下:
VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS。
测试中比较常见的的选择是PSS total,这种算法共享库内存按比例分配,对APP来说比较公平。依据APP关注点,也可选择其他指标例如USS,或者将其他指标也一起统计,用于分析。
例如用dumpsys meminfo命令看到,
手机管家进程的pss total = 16708 kb。
2、CPU
为什么要关注CPU?
(1)CPU使用率
想必你肯定有这样的经历:玩某个游戏或者APP的时候,手机发热发烫。是的,CPU的频繁使用,会让你的手机发烫,让你的手机变卡(CPU资源不足)。如果让用户发现你的APP用起来发烫,那就等着他的吐槽和卸载吧。
也就是说CPU性能,我们需要关注APP使用中CPU消耗情况,通常会使用CPU使用率这个指标。
(2)CPU jiffies
如果APP在退出界面后还有进程长期运行,那你需要关注下待机场景的CPU。待机场景下CPU的消耗一般不会很大,例如手机管家,可能消耗经常是0%,1%,长时间平均下,可能只有0.1%、0.2%,看看竞品,也是差不多,好像没有太大区别。
那么CPU消耗这么少是不是就不用管CPU了呢,然而即使是平均值很小,但是长时间待机,例如安全类工具,CPU的消耗还是不容忽视。那么这种情况如何评估CPU呢,这里引入一个更精确的指标:CPU时间片:jiffies!
Jiffies:为
Linux核心变数(unsigned long),它被用来
记录系统自开机以来,已经过了多少tick。一定时间占用的jiffies可以反映出此进程的CPU消耗。
Android系统可以获取到APP进程当前的CPU jiffies(这个数值不断累加)。我们测试时常用的单位有:消耗XX jiffies/分钟;半/1小时共增加XX jiffies。
Tips:Jiffies与变频
Linux 内核中提供了 performance 、powersave 、userspace、conservative 和 ondemand 五种变频模式供用户选择使用,它们在选择 CPU 合适的运行频率时使用的是各自不同的标准并分别适用于不同的应用场景。那么,测试CPU jiffies的时候是否需要固定CPU频率呢?理论来讲,固定CPU 频率肯定是可以的,那么不固定会怎样呢?
经测试数据验证,保持手机同环境情况下,不固定CPU频率对于测试无太大影响。
这组测试数据是没有固定CPU频率情况下测试了5次的jiffies数据(每次30min),可以看出,标准差为1.56,波动并不大,基本可以排除变频的影响。
3、电量
手机电池资源有限,电量的重要性就不必说了。现在很多手机都有电量排行,如果你的APP总是排在前面,小心被卸载哦。电量通常的单位是:mAs或者mAh。
4、流量
手机的一个特点就是有
移动网络。移动网络下的流量消耗需要特别关注,wifi下的流量优先级略低。流量单位:kb,M。
5、速度/耗时
可用性原则里面有个2秒原则:一个松散的原则,即用户没有必要对某些系统响应等待2秒以上的时间,比如应用程序转换和开始的响应时间。对于启动APP,进入某页面,这些操作时间都应不超过2秒,且越短用户体验越好。
当然,2秒并不是绝对的,对于一些用户感知明显的功能,例如垃圾扫描,病毒查杀,可能需要更多的时间,但是操作进行期间,需要给用户适当的感知和预期,避免用户因等待过久而离开。当然,用户是期望能够又准又快。
二、测试场景
性能要测哪些场景呢?用户实际使用中,场景是多种多样的。拿手机管家来说,有的用户每天喜欢拉拉小火箭;有的用户经常安装卸载app;有的用户喜欢用它清理垃圾;又有的用户有很多骚扰
电话和
短信;还有用户喜欢用它连免费wifi;另一些用户安装后不怎么使用。用户多种多样,功能多种多样,场景多种多样。要测试性能,这么多场景全部覆盖是不太可能的,要选择什么场景比较合适呢?
选择性能测试场景前,我们可以先将上述说的这些场景来分分类。
从用户使用APP时APP的activity是否在最前端,可将APP的使用场景分为:前台、后台。
在后台时根据APP只是保持心跳等最基础功能,还是一些场景触发了相关功能,可分为:后台待机和后台使用场景。