Android 是一个基于 Linux 内核的移动操作系统,Linux 的 CPU 占有率的计算方式也可以应用到 Android App 上。

今天分享的这个脚本的功能,是在多核情况下计算进程的 CPU 占有率。详细的算法,有一篇别人写的关于 Linux 环境下计算进程和线程的 CPU 占有率的文章,推荐一读,链接附在文末。

这里就简单说下计算步骤吧:

1.获取测试设备的 CPU 核心数

2.计算进程的 CPU 使用时间

3.计算总的 CPU 使用时间

4.进程的 CPU 使用率 = (进程的 CPU 使用时间 / 总的 CPU 使用时间) * CPU 核心数 * 100

代码如下:

#!/usr/bin/env bash
# 创建输出文件夹和临时文件夹
function init_data() {
if [[ ! -d ${OUTPUT} ]]; then
mkdir -p ${OUTPUT}
fi
if [[ ! -d ${TEMP_FILE} ]]; then
mkdir -p ${TEMP_FILE}
fi
}
# 通过adb shell ps命令获取进程号
function get_pid() {
adb shell ps | grep ${1} | tr -d $'\r' | awk '{print $2}' | head -n 1
}
# 通过adb shell cat /proc/cpuinfo命令计算出CPU核心数
function get_cpu_ker() {
adb shell cat /proc/cpuinfo | grep "processor" > ${TEMP_FILE}/processor_count
cpu_ker_count=`awk 'END{print NR}' ${TEMP_FILE}/processor_count`
echo ${cpu_ker_count}
}
# 通过adb shell cat /proc/<pid>/stat命令计算出进程CPU时间
function process_cpu_time() {
adb shell cat /proc/${1}/stat > ${TEMP_FILE}/process_cpu_time
utime=$(cat ${TEMP_FILE}/process_cpu_time | awk '{print $14}')
stime=$(cat ${TEMP_FILE}/process_cpu_time | awk '{print $15}')
cutime=$(cat ${TEMP_FILE}/process_cpu_time | awk '{print $16}')
cstime=$(cat ${TEMP_FILE}/process_cpu_time | awk '{print $17}')
result=`expr ${utime} + ${stime} + ${cutime} + ${cstime}`
echo ${result}
}
# 通过adb shell cat /proc/stat命令计算出总CPU时间
function total_cpu_time() {
adb shell cat /proc/stat > ${TEMP_FILE}/total_cpu_time
cat ${TEMP_FILE}/total_cpu_time | grep "cpu" | head -n 1 > ${TEMP_FILE}/total_cpu
user=$(cat ${TEMP_FILE}/total_cpu | awk '{print $2}')
nice=$(cat ${TEMP_FILE}/total_cpu | awk '{print $3}')
system=$(cat ${TEMP_FILE}/total_cpu | awk '{print $4}')
idle=$(cat ${TEMP_FILE}/total_cpu | awk '{print $5}')
iowait=$(cat ${TEMP_FILE}/total_cpu | awk '{print $6}')
irq=$(cat ${TEMP_FILE}/total_cpu | awk '{print $7}')
softirq=$(cat ${TEMP_FILE}/total_cpu | awk '{print $8}')
result=`expr ${user} + ${nice} + ${system} + ${idle} + ${iowait} + ${irq} + ${softirq}`
echo ${result}
}
# 计算进程的CPU占有率
function get_cpu_rate() {
process_cpu_time1=`process_cpu_time ${1}`
total_cpu_time1=`total_cpu_time`
sleep 1s
process_cpu_time2=`process_cpu_time ${1}`
total_cpu_time2=`total_cpu_time`
process_cpu_time3=$(( ${process_cpu_time2} - ${process_cpu_time1} ))
total_cpu_time3=$(( ${total_cpu_time2} - ${total_cpu_time1} ))
cpu_rate=$(bc <<< "scale=3;(${process_cpu_time3}/${total_cpu_time3})*${2}*100")
result=$(echo "scale=0;${cpu_rate}/1" | bc -l)
echo ${result}
}
# 获取脚本所在的路径
WORKSPACE=`pwd`
# 输出文件夹
OUTPUT=${WORKSPACE}/output_cpu
# 临时文件夹
TEMP_FILE=${OUTPUT}/temp
# 创建文件夹
init_data
# 获取应用包名
PACKAGE_NAME=${1}
# 获取进程号
pid=`get_pid ${PACKAGE_NAME}`
# 获取CPU核心数
cpu_ker=`get_cpu_ker`
# CPU占有率
rate=`get_cpu_rate ${pid} ${cpu_ker}`
echo ${rate}
# 返老还童
rm -r output_cpu

参考链接:

Linux环境下进程的CPU占用率


欢迎关注微信公众号"测试开发Stack",更多精彩文章第一时间发布!

Shell脚本 | 性能测试之CPU占有率的更多相关文章

  1. Shell脚本 | 性能测试之启动流量

    安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...

  2. Shell脚本 | 性能测试之启动时间

    安卓应用的性能测试,通常包括六个指标:启动时间.内存.CPU.耗电量.流量.流畅度. 除了耗电量,其他五个指标的数据在我们团队中已经可以通过运行脚本的方式获取到. 今天给大家分享下启动时间的脚本吧- ...

  3. Shell脚本 | 性能测试之内存

    性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...

  4. Android应用性能测试之CPU和内存占用

    最近发现自己学的很多东西没有做好积淀的工作,也萌生了写一些东西的念头.本人也没有写博客的习惯,下边就写一下手机端的性能测试. 最近公司,要我们从事对竞品的性能测试,我负责CPU和内存的性能测试,下面就 ...

  5. shell脚本之获取CPU使用率

    今天一个同事要测试OJ项目,同时我这边也需要知道他在压测过程中, CPU的使用率怎么样,虽说可以用top实时查看,但是进程太多了,我不需要获取那么多信息,我仅仅只要知道当前压测过程中CPU实时的使用率 ...

  6. Android 性能测试之CPU

    接上一篇 CPU跟内存一样,存在一些测试子项,如下清单所示 1.空闲状态下的应用CPU消耗情况 2.中等规格状态下的应用CPU消耗情况 3.满规格状态下的应用CPU消耗情况 4.应用CPU峰值情况 C ...

  7. [Android Pro] Android应用性能测试之CPU和内存占用(转载)

    首先稍做分析一下测试环境:我们知道CPU和内存占用是一个实时变化的状态,而市面上还没有具体的哪款android应用能做到实时监控CPU和内存占用并使用log日志保存.考虑到android的底层框架是基 ...

  8. Linux 性能监控之CPU&内存&I/O监控Shell脚本2

    Linux 性能监控之CPU&内存&I/O监控Shell脚本2   by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...

  9. Linux 性能监控之CPU&内存&I/O监控Shell脚本1

    Linux 性能监控之CPU&内存&I/O监控Shell脚本1   by:授客 QQ:1033553122   #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`if ...

随机推荐

  1. java命令分析线程死锁以及内存泄漏

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  2. node.js中使用zlib模块进行数据压缩和解压

    我们可以使用 zlib 模块来对数据进行压缩和解压处理,减小数据体积,加快传输速度. 一.通过创建转换流,对文件进行压缩和解压 const fs = require('fs'); const zlib ...

  3. 搭建RESTful API来使用Fabric Node SDK 开篇

    在Balance-Transfer中,有关于Node SDK比较完备的例子. SDK的官方文档在这里:https://fabric-sdk-node.github.io/ Balance-Transf ...

  4. CCPC-2017-秦皇岛站

    10月25日 听说信用卡到了好兴奋,然而没有额度是啥情况啊qwq. 晚上坐飞机出发,成都-鄂尔多斯-石家庄-秦皇岛,队友吐槽鄂尔多斯到石家庄好近啊,然后过了一会儿我们因为石家庄大雾迫降在了济南.嘤嘤嘤 ...

  5. RS232、RS485和RS422

    一.232电平.TTL电平和CMOS电平        1.232电平:逻辑1:-3V--15V: 逻辑0:+3-+15V. 2.TTL电平:逻辑1:5V: 逻辑0:0V.具体是,输出高电平:VOH≥ ...

  6. Linux-程序包管理

    Linux上的软件安装有2种形式:源码.二进制文件,源码需要在编译环境下编译安装,二进制可以直接安装. 1.程序包管理器 rpm 程序包管理器能够将目标二进制格式(也就是从源码编译好的二进制文件,包括 ...

  7. Android 使用 Camera2 完成预览和拍照

    Android API 21新增了Camera2,这与之前的camera架构完全不同,使用起来也比较复杂,但是功能变得很强大. 在讲解开启预览之前,首先需要了解camera2的几个比较重要的类: Ca ...

  8. 关于javac和java

    1.为什么安装完jdk后不配置环境变量就能直接运行java,而不能运行javac 在安装jdk的时候jdk会自带一个jre(java运行环境),还会单独安装一个jre,默认路径是和jdk在同级目录,而 ...

  9. struts2框架学习笔记5:OGNL表达式

    OGNL取值范围分两部分,root.Context两部分 可以放置任何对象作为ROOT,CONTEXT中必须是Map键值对 示例: 准备工作: public void fun1() throws Ex ...

  10. [Swift]LaunchScreen.storyboard如何跳转到到Main.storyboard

    在加载App时,首先读取[LaunchScreen.storyboard]中的内容, 在App加载到内存之后,自动读取[Main.storyboard]中的初始视图控制器, 用于替换原来的[Launc ...