Android CPU性能数据获取-阿里云开发者社区

开发者社区> awesome@qa> 正文

Android CPU性能数据获取

简介: 总体CPU 获取CPU信息思路 Android系统是基于Linux内核的,所以系统文件的结构和Linux下一样,系统总体CPU使用信息放在/proc/stat文件下,/proc/cpuinfo文件存放CPU的其它信息,包括CPU名称,直接读取即可。
+关注继续查看

总体CPU

获取CPU信息思路

Android系统是基于Linux内核的,所以系统文件的结构和Linux下一样,系统总体CPU使用信息放在/proc/stat文件下,/proc/cpuinfo文件存放CPU的其它信息,包括CPU名称,直接读取即可。

通过proc获取CPU信息:

Linux CPU 九元组参数解析(单位:jiffies): (jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)

user 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
nice 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
system 从系统启动开始累计到当前时刻,处于核心态的运行时间
idle 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间
iowait 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)
irq 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)
softirq 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)

可以每1s获取一次CPU信息,分析整机CPU占用率。总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen +guest

计算方法

1、 采样两个足够短的时间间隔的Cpu快照,分别记作t1,t2,其中t1、t2的结构均为: (user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;

2、 计算总的Cpu时间片totalCpuTime

a) 把第一次的所有cpu使用情况求和,得到s1;

b) 把第二次的所有cpu使用情况求和,得到s2;

c) s2 - s1得到这个时间间隔内的所有时间片,即totalCpuTime = s2 - s1 ;

3、计算空闲时间idle

idle对应第四列的数据,用第二次的idle - 第一次的idle即可 idle = idle2 - idle1

4、计算cpu使用率

CPU总使用率(%) = 100*((totalCputime2- totalCputime1)-(idle2-idle1))/(totalCputime2-totalCputime1)

示例代码

public static long getTotalCpuTime() {
        // 获取系统总CPU使用时间
        String[] cpuInfos = null;
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream("/proc/stat")), 1000);
            String load = reader.readLine();
            cpuInfos = load.split(" ");
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        long totalCpu = Long.parseLong(cpuInfos[2])
                + Long.parseLong(cpuInfos[3]) + Long.parseLong(cpuInfos[4])
                + Long.parseLong(cpuInfos[6]) + Long.parseLong(cpuInfos[5])
                + Long.parseLong(cpuInfos[7]) + Long.parseLong(cpuInfos[8]);
        return totalCpu;
    }

应用级CPU

单个应用CPU监控

Emmagee是将选中应用的PID传入,读取/proc/PID/stat文件信息及可获取该PID对应程序的CPU信息。

计算方法

1、首先获取应用的进程id: adb shell ps | grep com.package | awk '{print $2}' > tmp

2、根据进程id,通过proc获取CPU信息 while read line; do adb shell cat /proc/$line/stat | awk '{print $14,$15,$16,$17}' >> appcpu0; done < tmp

说明:以下只解释对我们计算Cpu使用率有用相关参数(14-17列) 参数解释

pid 进程号

utime 该任务在用户态运行的时间,单位为jiffies

stime 该任务在核心态运行的时间,单位为jiffies

cutime 所有已死线程在用户态运行的时间,单位为jiffies

cstime 所有已死在核心态运行的时间,单位为jiffies

结论:进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。 之后可以每1s获取一次CPU信息,分析获得app的CPU占用率等信息

单个程序的CPU使用率(%) = 100*(processCpuTime2-processCpuTime1)/(totalCpuTime2-totalCpuTime1)

示例代码

public static long getAppCpuTime(int pid) {
        // 获取应用占用的CPU时间
        String[] cpuInfos = null;
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream("/proc/" + pid + "/stat")), 1000);
            String load = reader.readLine();
            cpuInfos = load.split(" ");
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        long appCpuTime = Long.parseLong(cpuInfos[13])
                + Long.parseLong(cpuInfos[14]) + Long.parseLong(cpuInfos[15])
                + Long.parseLong(cpuInfos[16]);
        return appCpuTime;
    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作
SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作 1. SET/SET效率高,建立的主表和建表索引的查询表一般不排序, 2. BY语句,DATA步中,BY语句规定分组变量,用于控制SET,MERGE,UPDATE或MODIFY语句。 BY&lt;DESCENDING&gt;variable-1 &lt;...&lt;DESCENDI
1379 0
Android开发17——获取网络资源之XML数据
一、项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。 本文获取web项目返回的XML数据。     二、实例代码   Web项目 /** * 新闻业务类 * * @author xy * */ public class VideoNewsServiceImpl implements VideoNew
969 0
Android APP性能优化总结
​ 前述 最近在做app性能优化,这里做一个总结,供大家了解学习,也方便自己以后查阅. 用android的同学都知道,新买的手机用过一段时间后,手机变得越来越卡了;装了一些APP后,电量用得飞快,一天基本要一充;有些APP打开半天加载不出来;有些APP进入某些页面突然闪退;还有用了一些APP,流量...
1966 0
Android利用DDMS性能调优
前言:在android功能都开发完毕后,可以开始考虑优化代码。但要怎么入手呢?首先我们应该解决明显的UI卡顿,其次可以考虑内存优化等等。当然因为鄙人能力有限,有不到之处还请各位大神指教。
963 0
阿里云突发性能实例T5升级baseline新版评测,基于CPU20%性能
T5突发性能购买活动链接:https://www.aliyun.com/product/ecs?aly_as=kNATfj3Y&source=5176.11533457&userCode=8giwrppt&type=copy最近收到阿里云官方邀请,评测阿里云突发性能T5系列,此次新版本是由原来CPU基线的10%升级到20%,在性能上有所升级,这次评测我们以一个网站开发,以一个使用者进行来评测。
2468 0
+关注
awesome@qa
百度外卖用户端测试团队负责人,负责团队技术发展规划以及项目质量保障。负责设计并开发自动化测试框架与工具,帮助团队提升测试的质量和效率。深入理解持续集成体系建设,对质量体系有深刻的理解和积累。
99
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载