• Android 性能测试之CPU


    CPU测试

    CPU跟内存一样,存在一些测试子项,如下清单所示

      1.空闲状态下的应用CPU消耗情况
      2.中等规格状态下的应用CPU消耗情况
      3.满规格状态下的应用CPU消耗情况
      4.应用CPU峰值情况

     

    CPU的测试方法分为几类
    1.使用android提供的adb shell dumpsys cpuinfo |grep packagename >/address/cpu.txt来获取 ,要root
    2.使用top命令 adb shell top |grep packagename>/address/cpu.txt 来获取,要root
    3. 使用adb shell cat /proc/stat 来获取

     

    CPUINFO 详解:

    /proc/stat文件

             该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。

    实例数据:2.6.24-24版本上的

    xxx-desktop:~$ cat /proc/stat

    cpu  38082 627 27594 893908 12256 581 895 0 0

    cpu0 22880 472 16855 430287 10617 576 661 0 0

    cpu1 15202 154 10739 463620 1639 4 234 0 0

    intr 120053 222 2686 0 1 1 0 5 0 3 0 0 0 47302 0 0 34194 29775 0 5019 845 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    ctxt 1434984

    btime 1252028243

    processes 8113

    procs_running 1

    procs_blocked 0

    第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:

    参数          解析(单位:jiffies)

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

    user (38082)    从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。

    nice (627)      从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间

    system (27594)  从系统启动开始累计到当前时刻,处于核心态的运行时间

    idle (893908)   从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (12256) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)

    irq (581)           从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)

    softirq (895)      从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)stealstolen(0)                   which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)

    guest(0)                               which is the time spent running a virtual  CPU  for  guest operating systems under the control of the Linux kernel(since 2.6.24)

    结论总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen  +  guest

    /proc/<pid>/stat文件                                          

    该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计

    到当前时刻。以下通过实例数据来说明该文件中各字段的含义。

    [xxx@buick ~]# cat /proc/6873/stat

    6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0

    说明:以下只解释对我们计算Cpu使用率有用相关参数

    参数                                                                解释

    pid=6873                            进程号

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

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

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

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

    结论:进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。

    参考代码(python2.7):

    class CpuProfiler(BaseProfiler):
        def __init__(self, pid, adb, loghd):
            BaseProfiler.__init__(self, adb)
            self.appPid = pid
            self.loghd = loghd
            self.processcpuRatioList = []
            self.cpuRatioList = []
            self.lastRecord = {}
            self.lastTime = 0
            self.titile = ["应用占用CPU(%)", "总占用CPU(%)"]
    
        def init(self):
            processCpu = self.getprocessCpuStat()
            idleCpu, totalCpu = self.getTotalCpuStat()
            self.lastRecord["processCpu"] = processCpu
            self.lastRecord["idleCpu"] = idleCpu
            self.lastRecord["totalCpu"] = totalCpu
            self.lastTime = datetime.datetime.now()
            self.androidversion = self.getAndroidVersion()

    def getprocessCpuStat(self): #print "self.appPid="+self.appPid stringBuffer = self.adb.cmd("shell", "cat", "/proc/" + str(self.appPid) + "/stat").communicate()[0].decode( "utf-8").strip() r = re.compile("\s+") toks = r.split(stringBuffer) #想获取的是process的cpu个数,procs_running +procs_blocked processCpu = float(long(toks[13]) + long(toks[14])); #print "processCpu=", processCpu return processCpu def getTotalCpuStat(self): child_out = self.adb.cmd("shell", "cat", "/proc/stat").communicate()[0].decode("utf-8").strip().split(" ")[ 0] if int(self.androidversion) >= 19: child_out = self.adb.cmd("shell", "cat", "/proc/stat", "|grep ^cpu ").communicate()[0].decode( "utf-8").strip() if " grep: not found" in child_out: child_out = self.adb.cmd("shell", "cat", "/proc/stat").communicate()[0].decode("utf-8").strip().split(" ")[ 0] r = re.compile(r'(?<!cpu)d+') toks = r.findall(child_out) idleCpu = float(toks[3]) totalCpu = float(reduce(lambda x, y: long(x) + long(y), toks)); return idleCpu, totalCpu def profile(self): processCpu = self.getprocessCpuStat() idleCpu, totalCpu = self.getTotalCpuStat() currentTime = datetime.datetime.now() diffTime = currentTime - self.lastTime retry = False processcpuRatio = 100 * (processCpu - self.lastRecord["processCpu"]) / (totalCpu - self.lastRecord["totalCpu"]); cpuRatio = 100 * ((totalCpu - idleCpu) - (self.lastRecord["totalCpu"] - self.lastRecord["idleCpu"])) / ( totalCpu - self.lastRecord["totalCpu"]); if (diffTime.seconds * 1000 + diffTime.microseconds / 1000) < abs(totalCpu - self.lastRecord["totalCpu"]): self.loghd.info("cpu data abnormal, do again!") retry = True self.lastTime = currentTime self.lastRecord["processCpu"] = processCpu self.lastRecord["idleCpu"] = idleCpu self.lastRecord["totalCpu"] = totalCpu return round(float(processcpuRatio), 2), round(float(cpuRatio), 2), retry
  • 相关阅读:
    Linux常用命令大全
    C# 多线程、控制线程数提高循环输出效率
    【Redis笔记(四)】 Redis数据结构
    Redis 详解 (一) StackExchange.Redis Client
    C#中的线程(一)入门
    C#多线程
    StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
    【转】C#中使用Redis学习二 在.NET4.5中使用redis hash操作
    使用MongoDB.NET 2.2.4驱动版本对 Mongodb3.3数据库中GridFS增删改查
    .Net-Mongodb学习大全网址
  • 原文地址:https://www.cnblogs.com/Ronaldo-HD/p/9342404.html
Copyright © 2020-2023  润新知