安卓专项测试之cpu占用率统计方法及PerfDog和SoloPi比较

在我们的安卓cpu性能指标中,常规的关注是(1)cpu总体使用率(2)应用程序cpu占用率
Android cpu指标的查看方式有多种,最直接的就是android自带的DDMS可视化工具,也可以在IDE(Android Studio)的Monitor中实时查看。
还有就是通过adb shell 方式输入linux命令通过 /proc/stat和/proc//stat文件进行计算,也可以利用top命令或者dumpsys cupinfo等命令实时查看当前cpu情况
这边以/proc/stat及/proc//stat文件计算为例
第一步,通过adb shell命令进入Android shell命令模式,然后使用cat命令查看/proc/stat文件
安卓专项测试之cpu占用率统计方法及PerfDog和SoloPi比较_第1张图片
该文件显示的第一行就是cpu总体的使用情况,根据Linux用户手册,每列数据分别代表为 user , nice , system, idle , iowait , irq , softirq, stealstolen , guest , guest_nice,具体含义可自行查看手册.
那么CPU 总的使用时间计算公式如下:
totalCPUTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest + guest_nice
CPU 总的使用率 CPU Usage = CPU执行时间/CPU总时间 = (cpu总时间-idle)/CPU总时间
通常我们都会选择较短的时间进行两次cpu取样得到数据,那么上述公式可以转换为:
CPU Usage= (非空闲cpu时间点2-非空闲cpu时间点1)/(cpu总时间点2-cpu总时间1点)x100%
换成变量描述为:
totalUsage = 100 * ((currentJiffies - currentIdle) - (lastJiffies- lastIdle)) / (float) (currentJiffies - lastJiffies)

SoloPi 部分源码如下
 * /proc/stat CPU总时间为: cpu  569146 66246 275756 15100026 11684 81 11376 0 0 0
 * 第5位为Idle时间
 * 第2-8位之和为CPU总耗时
 * 占用率为(sum - Idel) / sum
 
 currentJiffies = Long.parseLong(cpuInfos[1]) + Long.parseLong(cpuInfos[2]) + Long.parseLong(cpuInfos[3])
				+ Long.parseLong(cpuInfos[4]) + Long.parseLong(cpuInfos[5]) + Long.parseLong(cpuInfos[6])
				+ Long.parseLong(cpuInfos[7]);
		Long cpuRunning = currentJiffies - lastJiffies;
		currentIdle = Long.parseLong(cpuInfos[4]);

		LogUtil.d(TAG, "Get Total cpu info: " + currentJiffies);
		LogUtil.d(TAG, "Get Total cpu idle: " + currentIdle);
		long gapIdle = currentIdle - lastIdle;
		LogUtil.d(TAG, "Get time gap: " + cpuRunning);
		LogUtil.d(TAG, "Get idle gap: " + gapIdle);
		float totalUsage = 100 * (cpuRunning - gapIdle) / (float) cpuRunning;

* 应用CPU处理
* /proc/pid/stat 应用占用情况
* 2265 (id.XXX) S 610 609 0 0 -1 1077952832 130896 1460 185 0 683 329 3 10 14 -6 63 0 1982194 2124587008 28421 18446744073709551615 1 1 0 0 0 0 4612 0 1073798392 18446744073709551615 0 0 17 3 0 0 0 0 0 0 0 0 0 0 0 0 0
* 第14-17位之和为应用占用CPU时间之和
部分源码如下:
Long pidProcessTime = Long.parseLong(processInfos[13]) + Long.parseLong(processInfos[14]) + Long.parseLong(processInfos[15]) + Long.parseLong(processInfos[16]);

                Long lastProcessTime = appProcessTime.get(pid);
                newAppProcessTime.put(pid, pidProcessTime);

                // 计算APP进程处理时间
                Long processRunning = pidProcessTime - lastProcessTime;
                appResult.put(pid, 100 * (processRunning / (float) cpuRunning));

但是腾讯的PerfDog认为:
PerfDog规范化CPU利用率与性能参数命名
Android:

CPU Usage:传统CPU利用率,也叫未规范化CPU利用率

    计算方法:当前时刻CPU频率下,CPU Usage = CPU执行时间/CPU总时间。

    备注:一般Android Studuio或Adb等获取的CPU利用率都是未规范化CPU利用率。

CPU Usage(Normalized):规范化CPU利用率

    由于移动设备CPU频率时刻变化,用传统CPU利用率计算方法,假定在低频率时刻计算出CPU利用率=30%,和在CPU高频时刻计算出CPU利用率=30%。同样都是30%但性能消耗是完全不样的,明显高频消耗更高。传统CPU利用率已无法真实反映性能消耗。

    所以我们需要一种规范化(可量化)的统计方式。将频率因素考虑进去。

    CPU Usage(Normalized)= (CPU执行时间/CPU总时间) * (当前时刻所有CPU频率之和/所有CPU频率最大值之和)。

PerfDog两种统计方式都有。CPU Usage默认为规范化CPU利用率。建议使用规范化CPU利用率作为衡量性能指标。

如下图,两种计算方式,cpu使用率相差较大

安卓专项测试之cpu占用率统计方法及PerfDog和SoloPi比较_第2张图片

SoloPi 使用完后会把文件保存在/storage/emulated/0/solopi/records/当前日期时间 目录下面
安卓专项测试之cpu占用率统计方法及PerfDog和SoloPi比较_第3张图片
通过adb pull命令,将目录下的文件导出到电脑中打开,
安卓专项测试之cpu占用率统计方法及PerfDog和SoloPi比较_第4张图片
安卓专项测试之cpu占用率统计方法及PerfDog和SoloPi比较_第5张图片
根据上面几张图显示,soloPi 和PerfDog 传统CPU利用率 差不多

你可能感兴趣的:(android)