精华内容
下载资源
问答
  • Android CPU proc技术方法1. proc/stat2. proc/[pid]>/stat3. 单核情况下Cpu使用的计算 1. proc/stat 该文件包含了所有CPU活动的信息,文件中的所有值都是从系统启动开始累计到当前时刻。 $ adb shell /proc/...

    1. proc/stat

    该文件包含了所有CPU活动的信息,文件中的所有值都是从系统启动开始累计到当前时刻。

    $ adb shell /proc/stat cpu
    //CPU指标:user,nice, system, idle, iowait, irq, softirq
    cpu  130216 19944 162525 1491240 3784 24749 17773 0 0 0
    cpu0 40321 11452 49784 403099 2615 6076 6748 0 0 0
    cpu1 26585 2425 36639 151166 404 2533 3541 0 0 0
    cpu2 22555 2957 31482 152460 330 2236 2473 0 0 0
    cpu3 15232 1243 20945 153740 303 1985 3432 0 0 0
    cpu4 5903 595 6017 157410 30 10959 605 0 0 0
    cpu5 4716 380 3794 157909 23 118 181 0 0 0
    cpu6 8001 515 8995 157571 48 571 180 0 0 0
    cpu7 6903 377 4869 157885 31 271 613 0 0 0
    
    • user (130216) :从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies),不包含nice值为负的进程。
    • nice(13295) :从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
    • system(162525) :从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
    • idle(422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
    • iowait(171474): 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies)
    • irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
    • softirq(5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)
      1 jiffies 约等于 10ms
      totalCpuTime=user+system+nice+idle+iowait+irq+softirq

    2. proc/[pid]>/stat

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

    $ adb shell cat /proc/1557/stat
    //CPU指标:utime、stime、cutime、cstime 
    1557 (system_server) S 823 823 0 0 -1 1077952832 //1~9
    2085481 15248 2003 27 166114 129684 26 30  //10~17
    10 -10 221 0 2284 2790821888 93087 18446744073709551615 //18~25
    1 1 0 0 0 0 6660 0 36088 0 0 0 17 3 0 0 0 0 0 0 0 0 0 0 0 0 0
    
    • pid: 进程ID,此处等于1557
    • utime: 该进程处于用户态的时间,此处等于166114,单位jiffies
    • stime: 该进程处于内核态的时间,此处等于129684,单位jiffies
    • cutime: 当前进程等待子进程的utime, 此处等于26,单位jiffies
    • cstime: 当前进程等待子进程的utime,此处等于30,单位jiffies

    进程的总Cpu时间 processCpuTime = utime + stime+ cutime + cstime,(图中第14-17个数求和)该值包括其所有线程的cpu时间

    3. 单核情况下Cpu使用率的计算

    通过读取/proc/stat 、/proc/<pid>/stat、/proc/<pid>/task/<tid>/stat以及/proc/cpuinfo这几个文件获取总的Cpu时间、进程的Cpu时间、线程的Cpu时间、Cpu的个数的信息,然后通过一定的算法进行计算(采样两个足够短的时间间隔的Cpu快照与进程快照来计算进程的Cpu使用率)。

    • 总的Cpu使用率计算计算方法:

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

      • 2、计算总的Cpu时间片totalCpuTime

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

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

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

    • 3、计算空闲时间idle

      • idle = 第二次的第四列 - 第一次的第四列
    • 4、计算cpu使用率

      • pcpu=100* (total-idle)/total
    • 某一进程Cpu使用率的计算计算方法:

    • 1.采样两个足够短的时间间隔的cpu快照与进程快照,

      • a) 每一个cpu快照均为(user、nice、system、idle、iowait、irq、softirq)的7元组;

      • b) 每一个进程快照均为 (utime、stime、cutime、cstime)的4元组;

    • 2. 分别根据 a和b的方式计算出两个时刻的总的cpu时间与进程的cpu时间,分别记作:totalCpuTime1、totalCpuTime2、processCpuTime1、processCpuTime2

    • 3. 计算该进程的cpu使用率pcpu = 100*( processCpuTime2– processCpuTime1)/ (totalCpuTime2– totalCpuTime1) (按100%计算,如果是多核情况下还需乘以cpu的个数);

    class PerfSense:
        def __init__(self, deviceTup=('', '')):
            self.deviceID, self.phone_name = deviceTup
            self.prefix_id = '-s %s' % self.deviceID if self.deviceID else ''
            self.package = ''
            self.pid = self.get_pid()
            self.colorCode = 36
    
        # 获取进程pid
        def get_pid(self):
            if not self.package:
                self.package = getFocusedPackage()
            pidInfo = getAdbResponse('adb %s shell ps "|" grep %s' % (self.prefix_id, self.package))
            # pidInfo = getAdbResponse('adb %s shell ps "|" grep %s' % (self.prefix_id, self.package))
            pid = pidInfo.split()[1]
            return pid
    
        def getTotalCpuTime(self):
    
            totalCpuInfo = getAdbResponse("adb %s shell cat /proc/stat" % self.prefix_id)
            totalCpuTimeList = re.findall('cpu\s(.*?)\\r', totalCpuInfo)[0].split()[:7]
            totalCpuTime = reduce(lambda x, y: int(x) + int(y), totalCpuTimeList)
            return totalCpuTime
    
        def getProcessCpuTime(self):
            processCpuInfo = getAdbResponse("adb %s shell cat /proc/%s/stat" % (self.prefix_id, self.pid))
            processCpuTimeList = processCpuInfo.split()[13:17]
            processCpuTime = reduce(lambda x, y: int(x) + int(y), processCpuTimeList)
            return processCpuTime
    
        def getSingCpuRate(self):
            processCpuTime_1 = self.getProcessCpuTime()
            totalCpuTime_1 = self.getTotalCpuTime()
            time.sleep(0.5)
            processCpuTime_2 = self.getProcessCpuTime()
            totalCpuTime_2 = self.getTotalCpuTime()
    
            cpuRate = int((processCpuTime_2 - processCpuTime_1) / (totalCpuTime_2 - totalCpuTime_1) * 100)
            return cpuRate
    
        def getCpuRate(self):
            print("\033[1;36m**********************************")
            print("Start to get CPU Utilization Rate:")
            print("**********************************\033[1;33m")
            count = readConfig.MemorySetting.count
            cpuRateList = []
            try:
                with tqdm(range(count), ascii=True) as t:
                    for _ in t:
                        cpuRateList.append(self.getSingCpuRate())
            except KeyboardInterrupt as e:  # 捕获意外终止程序的异常,例如Ctrl + C
                print(e)
            # print(cpuRateList)
            value = sorted(cpuRateList)[1:-1]
            mem_ave, mem_min, mem_max = np.average(value), np.min(value), np.max(value)
            print("\033[1;%sm内存平均值:%s\t内存最小值:%s\t内存最大值:%s" %
                  (str(self.colorCode), mem_ave, mem_min, mem_max))
            self.colorCode -= 2
            cpuRateDict = {'mem_ave': mem_ave, 'mem_min': mem_min, 'mem_max': mem_max}
    
            return {self.phone_name: cpuRateDict}
    
    展开全文
  • 文|中国电子银行网 陈璐溦为持续跟踪和检测手机银行APP的兼容性和易用...经测试发现,20家手机银行APP存在CPU占用率安卓端差距悬殊、流量消耗在不同手机银行之间消耗过多等问题。这说明,银行在保证功能丰富度、使...

    文|中国电子银行网 陈璐溦

    为持续跟踪和检测手机银行APP的兼容性和易用性等方面的表现,为行业发展提供有益参考,中国电子银行网联合CFCA兼容和性能测试平台对20家农村商业银行客户端进行测试。今年测试范围首次加入IOS系统,与安卓系统并行测试,测试范围更为全面。

    经测试发现,20家手机银行APP存在CPU占用率在安卓端差距悬殊、流量消耗在不同手机银行之间消耗过多等问题。这说明,银行在保证功能丰富度、使用便捷度的同时,需要更注重性能问题,这将对提升手机银行用户体验有着较为积极的意义。此外,有6家农村商业银行并未提前适配安卓11 BETA版。

    整体来说,对比近两年安卓系统版本的数据,不难看出20家农村商业银行手机银行APP经过一年的努力,性能情况有比较大的改善,在启动时长、CPU占用率、内存占用、耗电量等数据上有较大优化。同时,随着农村商业银行功能的不断丰富,总流量消耗成为APP重灾区。

    e4a9264b024f188edf8775e0141551a0.png

    由于今年被测农村商业银行由15家增加到20家,且测试机型和APP版本不同,因此以上数据仅作为参考。

    在兼容性方面,20家农村商业银行APP安卓和IOS客户端整体兼容性表现良好,多数银行在当前市面流行的主流手机适配测试均测试通过。性能方面,20家农村商业银行在启动用户体验时间、CPU占用率、内存占用、电量消耗和平均页面响应时长方面表现均良好,但在网络流量方面小部分银行存在消耗设备资源的情况。在功能列表菜单方面各家银行差距较大,多的可达90多个功能,少的只有32个功能。

    兼容性测试

    安卓端APP兼容性远不如IOS端 ,30%的银行APP均未适配Android 11

    在测试的200台安卓端设备里,整体兼容性表现良好,可以正常安装、运行、卸载,且没有明显UI问题,但仍然有30%的农村商业银行手机银行安卓客户端未提前进行安卓11 BETA版的适配,在该系统设备中出现启动闪退,启动失败的情况,正式版本已在9月9号发布,手机银行还需尽快适配。

    7c5d861ebe9494ecd93e32729889ca30.png

    在IOS客户端中,20家农村商业银行APP在19台IPHONE设备中均未出现兼容性问题,整体兼容性表现良好,可以正常安装、运行、卸载,且没有明显UI问题。

    1c35f5c18e7f379f59ace49c0bc18d8e.png

    性能测试

    应用启动用时最短不到1秒 最长可达7秒以上

    根据用户最佳体验原则,在今年测试的20家农村商业银行中,有85%的手机银行APP启动后5秒内完成所有加载达到用户可操作首页面体验最佳标准,有3家银行未满足该原则。其中,Android端有1家银行APP启动时间大于5秒,IOS端有2家银行APP启动时间大于5秒。但总体而言,在APP启动时间方面,今年的评测结果明显优于去年的(去年仅有73%的手机银行APP完全加载完成用时在最佳体验用时以内),用户体验有较大改善。

    在安卓客户端,20家农村商业银行启动用户体验时间分布在0.98秒到7.01秒之间,差别较大,平均为2.56秒,较去年改善41%,最大为7.01秒。其中,江西农商银行手机银行启动用户体验时间最短,从用户点击APP图标到可操作的首页面完全加载完成仅用时0.98秒。

    69081a52a6c03afc8129d59cbdf90797.png

    在IOS客户端,20家农村商业银行启动用户体验时间分布在1.20秒到6.19秒之间,平均为2.77秒,最大为6.19秒。其中,云南省农村信用社联合社APP启动用户体验时间最短,从用户点击APP图标到可操作的首页面完全加载完成用时为1.20秒。

    afcc1884f6f1cb5a54d4037878558e96.png

    CPU占用率各行差距最大可达32倍

    20家农村商业银行安卓和IOS客户端APP CPU占用率均在10%以内。在安卓客户端,APP 运行时的CPU占用率在0.25%到8.15%不等,平均占用为2.92%,较去年同比降低3.95%,最高占用为8.15%。其中,CPU占用率最低为无锡农村商业银行手机银行,运行时平均占用仅为0.25%。

    cccc7e33708eb0a360d3de569bf195d0.png

    在IOS客户端,手机银行APP运行时的CPU占用率在1.13%到4.81%不等,平均占用为2.48%,最高占用为4.81%。其中,CPU占用率最低为苏州农村商业银行手机银行,运行时平均占用达1.13%。

    6881c14ebb7b0464d4295f18cb37c3a6.png

    内存占用IOS端明显优于安卓端

    20家农村商业银行APP在安卓客户端内存占用差距明显,差距最大可达5倍以上,所有银行APP运行均可顺畅运行且不会对设备造成较大资源占用。内存占用差距较大也可体现出不同银行APP对于内存优化的优劣。而在IOS客户端的内存占用,各家银行APP基本处于统一水平,平均在27M左右。

    398cc76da6c70ad0b44184bfc7f9556f.png

    在安卓客户端,20家农村商业银行APP 运行时内存占用是73.72M到383.87M不等,平均占用为220.48M,最高占用为383.87M。其中,最低内存占用为昆山农村商业银行手机银行,运行时平均占用73.72M。

    在IOS客户端,20家农村商业银行APP 运行时的内存占用是25.48M到28.62M不等,平均占用为26.94M,最高占用为28.62M。其中,最低内存占用为鄞州银行手机银行,运行时平均占用25.48M。

    5934ce1025ff19f0fdc5a8bc163dbea9.png

    流量消耗成为部分银行手机银行APP的重灾区

    20家农村商业银行安卓和IOS客户端APP网络流量普遍在可接受范围内,但与全国性商业银行的手机银行相比差距明显。在安卓客户端,手机银行APP运行时2分钟随机点击消耗总流量是0.16KB到636.98KB不等,平均消耗67.57KB,最高为636.98KB。其中,最低流量消耗为昆山农村商业银行手机银行,运行消耗流量0.16KB。

    df0f51d08583f1ac88d1d48a5fd17a31.png

    在IOS客户端,20家农村商业银行APP 运行时2分钟随机点击消耗总流量603KB到4657KB不等,平均消耗2375.7KB,最高为4657KB。其中,最低流量消耗为浙江省农村信用社联合社手机银行,运行消耗流量仅为603KB。

    019804f5c5e5a94c7302b4974066c5df.png

    平均耗电量较去年减少50%

    20家农村商业银行安卓和IOS客户端APP电量消耗均在可接受范围内,安卓端耗电量较去年明显减少。其中,安卓客户端APP运行时2分钟随机点击消耗总电量2.09毫安到5.85毫安不等,平均消耗3.39毫安,较去年减少近50%,最高消耗为5.85毫安。最低电量消耗为云南省农村信用社联合社手机银行,运行消耗2.09毫安。

    bad82183c08718c08ee7e61e149ea348.png

    IOS客户端APP运行时2分钟随机点击消耗总电量36.12毫安到41.98毫安不等,平均消耗39.10毫安,最高消耗为41.98毫安。最低电量消耗是上海农商银行手机银行,运行消耗36.12毫安。

    daeb2ed81081162f3bed33923fa10326.png

    其他测试

    各行APP平均页面响应时间均在2秒以内

    20家农村商业银行在安卓和IOS客户端APP页面的平均响应时间较快。安卓客户端,手机银行APP“账户”、“理财产品”、“缴费”、“转账”和“我的页面”平均响应时间从0.178秒到0.688秒不等,平均为0.35秒。其中,响应时间最短的是常熟农商银行APP,仅为0.178秒。

    d4ade6b0494ea308301788e800801daa.png

    在IOS客户端,手机银行APP在“我的账户”、“转账”、“理财”、“信用卡”和“生活页面”的平均响应时间从0.628秒到1.562秒不等,平均为1.05秒。其中,平均响应时间最短的是广州农商银行APP,为0.628秒。

    a8d4ed91ccd2538067b4e32eb325ec99.png

    全部功能菜单展示策略大相径庭

    功能菜单数量方面20家农村商业银行差距较大,安卓和IOS客户端展示的一级功能菜单最多能达到90多个,最少的只有32个,平均功能数量在60个左右。一级功能菜单展示数量也反应手机银行业运营策略,功能模块展示多的会导致用户在搜索上便捷度不足,但功能列表少的也需要用户多次点击才能找到具体细项。

    74793ef124615913e3febb3e3dc2e88e.png

    安卓客户端APP全部功能数量从45个到93个不等,平均66个;IOS客户端APP全部功能数量从32个到90个不等,平均65个。其中,功能列表展示最多的是浙江省农村信用社联合社APP。

    7008a375fee49a42f9c7843d54edef9e.png

    测试说明

    本次测试包含20家农村商业银行的个人手机银行安卓和IOS手机客户端,包括了浙江省农村信用社联合社、深圳农村商业银行、江阴农村商业银行、无锡农村商业银行、江西农商银行、四川省农村信用社联合社、广州农商银行、苏州农村商业银行、重庆农村商业银行、云南省农村信用社联合社、广东省农村信用社联合社、上海农商银行、张家港农商银行、常熟农商银行、成都农商银行、昆山农村商业银行、鄞州银行、安徽省农村信用社联合社、山东省农村信用社联合社、北京农商银行。(银行顺序随机排布)

    测试APP的版本截止于2020年8月31日,各个银行官网的下载版本。详细如下:

    安卓客户端:

    5a51ef6e2b57b11987f55efd8dccb3ec.png

    (版本列表随机排布)

    IOS客户端:

    88fbea7fb8a7fa299d393760cd9444e8.png

    (版本列表随机排布)

    本次测试共分为APP兼容性测试、性能测试、其他测试三大方面,共8个指标。包括主流手机设备兼容情况、各自APP的功能数量、5个典型页面的响应时间、APP启动时间、CPU占用率、网络流量、内存占用、电量消耗。

    具体指标解释如下:

    2c7091a9a742e72b44cfdc7bce1944e6.png

    兼容性测试情况覆盖了200款主流安卓手机、19款IPHONE手机进行。本次测试使用性能测试环境安卓端华为P40 PRO,安卓系统版本10.0,IOS端为iphone7plus IOS系统版本为11.4.1。网络环境为CFCA测试WIFI(中国电信网络)连接。测试过程中系统无其他APP后台运行,被测试银行手机银行APP在无其他APP干扰情况下冷启动开始测试,测试过程采取随机测试,测试时长大约2到3分钟。

    本次测试兼容性情况使用设备分布情况如下:

    安卓客户端:

    6c9d5fea0b39cf9ba7c3a6153414756d.png

    92bb16dd7cb2ee431ef92fd83a8048db.png

    0725c5ff6d3ad0bd7b567eb0dcef7c12.png

    2afd0e2d1f97a7a20adbce63cc684e50.png

    IOS客户端:

    45a3a5c5ed8cc292e62b16658b52fac1.png

    3a3dccd58ef95b5e48e5f0fdfdd29b66.png

    770808a3559a43c33f266c7a9216aacf.png

    e12fd458e8bcda30be29ed0bd0a400e2.png

    展开全文
  • iPhone-iOS-从应用程序获取CPU使用有谁知道如何获取应用程序的CPU使用? 绝对有可能,因为应用商店中有一些可以显示它的应用程序(活动监视器触摸)。3个解决方案74 votes更新。 这段代码为我工作:更新2。thread_...

    iPhone-iOS-从应用程序获取CPU使用率

    有谁知道如何获取应用程序的CPU使用率? 绝对有可能,因为应用商店中有一些可以显示它的应用程序(活动监视器触摸)。

    3个解决方案

    74 votes

    更新。 这段代码为我工作:

    更新2。thread_list泄漏,因此添加了vm_deallocate

    #import

    #import

    float cpu_usage()

    {

    kern_return_t kr;

    task_info_data_t tinfo;

    mach_msg_type_number_t task_info_count;

    task_info_count = TASK_INFO_MAX;

    kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count);

    if (kr != KERN_SUCCESS) {

    return -1;

    }

    task_basic_info_t basic_info;

    thread_array_t thread_list;

    mach_msg_type_number_t thread_count;

    thread_info_data_t thinfo;

    mach_msg_type_number_t thread_info_count;

    thread_basic_info_t basic_info_th;

    uint32_t stat_thread = 0; // Mach threads

    basic_info = (task_basic_info_t)tinfo;

    // get threads in the task

    kr = task_threads(mach_task_self(), &thread_list, &thread_count);

    if (kr != KERN_SUCCESS) {

    return -1;

    }

    if (thread_count > 0)

    stat_thread += thread_count;

    long tot_sec = 0;

    long tot_usec = 0;

    float tot_cpu = 0;

    int j;

    for (j = 0; j < (int)thread_count; j++)

    {

    thread_info_count = THREAD_INFO_MAX;

    kr = thread_info(thread_list[j], THREAD_BASIC_INFO,

    (thread_info_t)thinfo, &thread_info_count);

    if (kr != KERN_SUCCESS) {

    return -1;

    }

    basic_info_th = (thread_basic_info_t)thinfo;

    if (!(basic_info_th->flags & TH_FLAGS_IDLE)) {

    tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds;

    tot_usec = tot_usec + basic_info_th->user_time.microseconds + basic_info_th->system_time.microseconds;

    tot_cpu = tot_cpu + basic_info_th->cpu_usage / (float)TH_USAGE_SCALE * 100.0;

    }

    } // for each thread

    kr = vm_deallocate(mach_task_self(), (vm_offset_t)thread_list, thread_count * sizeof(thread_t));

    assert(kr == KERN_SUCCESS);

    return tot_cpu;

    }

    ivanzoid answered 2020-07-09T18:06:54Z

    8 votes

    对于Swift 3:

    fileprivate func cpuUsage() -> Double {

    var kr: kern_return_t

    var task_info_count: mach_msg_type_number_t

    task_info_count = mach_msg_type_number_t(TASK_INFO_MAX)

    var tinfo = [integer_t](repeating: 0, count: Int(task_info_count))

    kr = task_info(mach_task_self_, task_flavor_t(TASK_BASIC_INFO), &tinfo, &task_info_count)

    if kr != KERN_SUCCESS {

    return -1

    }

    var thread_list: thread_act_array_t? = UnsafeMutablePointer(mutating: [thread_act_t]())

    var thread_count: mach_msg_type_number_t = 0

    defer {

    if let thread_list = thread_list {

    vm_deallocate(mach_task_self_, vm_address_t(UnsafePointer(thread_list).pointee), vm_size_t(thread_count))

    }

    }

    kr = task_threads(mach_task_self_, &thread_list, &thread_count)

    if kr != KERN_SUCCESS {

    return -1

    }

    var tot_cpu: Double = 0

    if let thread_list = thread_list {

    for j in 0 ..< Int(thread_count) {

    var thread_info_count = mach_msg_type_number_t(THREAD_INFO_MAX)

    var thinfo = [integer_t](repeating: 0, count: Int(thread_info_count))

    kr = thread_info(thread_list[j], thread_flavor_t(THREAD_BASIC_INFO),

    &thinfo, &thread_info_count)

    if kr != KERN_SUCCESS {

    return -1

    }

    let threadBasicInfo = convertThreadInfoToThreadBasicInfo(thinfo)

    if threadBasicInfo.flags != TH_FLAGS_IDLE {

    tot_cpu += (Double(threadBasicInfo.cpu_usage) / Double(TH_USAGE_SCALE)) * 100.0

    }

    } // for each thread

    }

    return tot_cpu

    }

    fileprivate func convertThreadInfoToThreadBasicInfo(_ threadInfo: [integer_t]) -> thread_basic_info {

    var result = thread_basic_info()

    result.user_time = time_value_t(seconds: threadInfo[0], microseconds: threadInfo[1])

    result.system_time = time_value_t(seconds: threadInfo[2], microseconds: threadInfo[3])

    result.cpu_usage = threadInfo[4]

    result.policy = threadInfo[5]

    result.run_state = threadInfo[6]

    result.flags = threadInfo[7]

    result.suspend_count = threadInfo[8]

    result.sleep_time = threadInfo[9]

    return result

    }

    Lionking answered 2020-07-09T18:07:14Z

    0 votes

    试试这个:

    - (NSString *)cpuUsage

    {

    kern_return_t kr;

    task_info_data_t tinfo;

    mach_msg_type_number_t task_info_count;

    task_info_count = TASK_INFO_MAX;

    kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count);

    if (kr != KERN_SUCCESS)

    {

    return @"NA";

    }

    task_basic_info_t basic_info;

    thread_array_t thread_list;

    mach_msg_type_number_t thread_count;

    thread_info_data_t thinfo;

    mach_msg_type_number_t thread_info_count;

    thread_basic_info_t basic_info_th;

    uint32_t stat_thread = 0; // Mach threads

    basic_info = (task_basic_info_t)tinfo;

    // get threads in the task

    kr = task_threads(mach_task_self(), &thread_list, &thread_count);

    if (kr != KERN_SUCCESS)

    {

    return @"NA";

    }

    if (thread_count > 0)

    stat_thread += thread_count;

    long tot_idle = 0;

    long tot_user = 0;

    long tot_kernel = 0;

    int j;

    for (j = 0; j < thread_count; j++)

    {

    thread_info_count = THREAD_INFO_MAX;

    kr = thread_info(thread_list[j], THREAD_BASIC_INFO,

    (thread_info_t)thinfo, &thread_info_count);

    if (kr != KERN_SUCCESS)

    {

    return nil;

    }

    basic_info_th = (thread_basic_info_t)thinfo;

    if (basic_info_th->flags & TH_FLAGS_IDLE)

    {

    //This is idle

    tot_idle = tot_idle + basic_info_th->user_time.microseconds + basic_info_th->system_time.microseconds;

    } else {

    //This is user

    tot_user = tot_user + basic_info_th->user_time.microseconds;

    //This is kernel

    tot_kernel = tot_kernel + basic_info_th->system_time.microseconds;

    }

    } // for each thread

    kr = vm_deallocate(mach_task_self(), (vm_offset_t)thread_list, thread_count * sizeof(thread_t));

    assert(kr == KERN_SUCCESS);

    long tot_cpu = tot_idle + tot_user + tot_kernel

    return [NSString stringWithFormat:@"Idle: %.2f, User: %.2f, Kernel: %.2f", tot_idle/tot_cpu, tot_user/tot_cpu, tot_kernel/tot_cpu];

    }

    但是,该方法会根据每个过程的起点来计算百分比。 如果您正在寻找更传统的方式来计算这些数字,请参见Petesh的答案。

    Coder256 answered 2020-07-09T18:07:39Z

    展开全文
  • 实时获取Android手机CPU占用率

    千次阅读 2016-12-03 22:35:13
    因为手机上并没有存储CPU占用率的文件,我们需要通过已有的数据计算得到CPU占用率。在/proc/stat文件里存储的数据,是从系统启动开始累计到当前时刻CPU活动的信息。读取该文件信息如下: 通过获取c

    前面写了实时获取Android手机的CPU频率,这个只需要读取/sys/devices/system/cpu/cpu0/cpufreq下的文件即可。但是如果想获取CPU的占用率,就不是这么简单了。因为手机上并没有存储CPU占用率的文件,我们需要通过已有的数据计算得到CPU占用率。

    在/proc/stat文件里存储的数据,是从系统启动开始累计到当前时刻CPU活动的信息。读取该文件信息如下:
    这里写图片描述

    通过获取cpu一行的数据,即可进行CPU占用率的计算。我们会用到的数据有:
    - user(21441),从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含nice值为负的进程。
    - nice(3634),从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。
    - system(13602),从系统启动开始累计到当前时刻,处于核心态的运行时间。
    - idle(818350),从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间。
    - iowait(3535),从系统启动开始累计到当前时刻,IO等待时间。
    - irq(2),从系统启动开始累计到当前时刻,硬中断时间。
    - softirq(99),从系统启动开始累计到当前时刻,软中断时间。

    总的CPU时间totalTime = user+nice+system+idle+iowait+irq+softirq

    总的CPU占用率的计算方法为:采样两个足够短的时间间隔的CPU快照,CPU占用率 = 100*((totalTime2-totalTime1)-(idle2-idle1))/(totalTime2-totalTime1)
    其中totalTime2-totalTime1为采样时间间隔内所有的CPU时间片,idle2-idle1为空闲时间片,CPU执行非系统空闲进程的时间/CPU总的执行时间,即得到CPU的占用率。

    具体算法实现如下:

    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * Created by yt on 2016/11/15.
     */
    
    public class getRate {
        public static float getRate(){
            Map<String,String> map1 = getMap();//采样第一次CPU信息快照
            long totalTime1 = Long.parseLong(map1.get("user")) + Long.parseLong(map1.get("nice"))
                             + Long.parseLong(map1.get("system")) + Long.parseLong(map1.get("idle"))
                             + Long.parseLong(map1.get("iowait")) + Long.parseLong(map1.get("irq"))
                             + Long.parseLong(map1.get("softirq"));//获取totalTime1
            long idleTime1 = Long.parseLong(map1.get("idle"));//获取idleTime1
            try{
                Thread.sleep(360);//等待360ms
            }catch (Exception e){
                e.printStackTrace();
            }
            Map<String,String> map2 = getMap();//采样第二次CPU快照
            long totalTime2 = Long.parseLong(map2.get("user")) + Long.parseLong(map2.get("nice"))
                    + Long.parseLong(map2.get("system")) + Long.parseLong(map2.get("idle"))
                    + Long.parseLong(map2.get("iowait")) + Long.parseLong(map2.get("irq"))
                    + Long.parseLong(map2.get("softirq"));//获取totalTime2
            long idleTime2 = Long.parseLong(map2.get("idle"));//获取idleTime2
            float cpuRate = 100*((totalTime2-totalTime1)-(idleTime2-idleTime1))/(totalTime2-totalTime1);
            return cpuRate;
        }
    
        //采样CPU信息快照的函数,返回Map类型
        public static Map<String,String> getMap(){
            String[] cpuInfos = null;
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/stat")));//读取CPU信息文件
                String load = br.readLine();
                br.close();
                cpuInfos = load.split(" ");
            }catch (IOException e){
                e.printStackTrace();
            }
            Map<String,String> map = new HashMap<String,String>();
            map.put("user",cpuInfos[2]);
            map.put("nice",cpuInfos[3]);
            map.put("system",cpuInfos[4]);
            map.put("idle",cpuInfos[5]);
            map.put("iowait",cpuInfos[6]);
            map.put("irq",cpuInfos[7]);
            map.put("softirq",cpuInfos[8]);
            return map;
        }
    }

    结合前面文章中的定时获取逻辑,即可实现定时获取Android手机CPU占用率。效果如图(为了验证正确性,我对cpuInfos和idleTime做了输出):
    这里写图片描述

    展开全文
  • Android App性能之--cpu占用率

    千次阅读 2020-04-26 15:02:47
    获取Android App cpu占用率一般有两种方式,一个是用dumpsys cpuinfo,另一个是top 1、dumpsys cpuinfo命令 Android提供的dumpsys工具可以用于查看系统服务信息与状态,dumpsys cpuinfo可以用来查看安卓系统当前的...
  • android安卓app开发之如何查看cpu使用和内存泄漏.zip
  • 嵌入式系统中如何降低CPU占用率

    千次阅读 2018-08-01 07:32:18
    在软件开发和性能测试中,CPU占用率是一个很重要的指标,到底有哪些因素会导致CPU占用率上升呢?又有哪些手段可以降低CPU的占用率呢?简单地总结了一下关于CPU占用率的那些事。 1. 如何测试CPU占用率? 首先,...
  • Windows中的内存不足如果在运行Windows应用程序时,出现“内存不足”的故障,可按下列方法进行检查和处理:1、首先应检查Windows的资源使用情况,如果资源占用较多,可用资源较少,打开新文件时会出现“内存不足"的...
  • *记录开发中的问题,方便以后自已...adb shell 输 入 top 查看系统资源,发现 CPU占用率节节升高.我的去。* 最终发现是线程没有关闭,而不停的创建新的线程 ,private class TrackThred extends Thread { private byte
  • 统计Android应用的CPU占用率

    千次阅读 2020-02-22 13:07:11
    /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如...
  • 在我们的安卓cpu性能指标中,常规的关注是(1)cpu总体使用率(2)应用程序cpu占用率 Android cpu指标的查看方式有多种,最直接的就是android自带的DDMS可视化工具,也可以在IDE(Android Studio)的Monitor中实时...
  • 行业分类-设备装置-安卓平台上进程的CPU占用率确定方法和装置.zip
  • Android通过执行脚本提高cpu占用率

    千次阅读 2019-06-12 21:08:59
    最近有个需求需要在cpu占用80 90%的时候进行测试: 脚本内容(test.sh): #!/system/bin/sh while true do done 即执行一个死循环,这里最好是用linux编辑然后保存,否则android不能识别 1、push test.sh到data/下,...
  • android Profiler 实战-----CPU占用率分析

    千次阅读 2019-09-09 13:07:36
    前期准备 1、连接手机 ...2、app启动后在AndroidStudio中会看到下面这张表格: CPU相关指标查看 点击右边CPU模块,可查CPU详细数据: 按图上的数字解释: 1、当前进程中的所有线程。...
  • Android 手机CPU 占用率过高

    千次阅读 2013-04-28 09:42:54
    这时才想起了查看CPU的消耗情况(如何查看资源消耗),一看吓一跳,这么个小程序都耗了50%-60%d CPU 。  写了个测试程序测试线程空转会消耗多少CPU,当我在开启一个线程(只执行简单的打印)时,差不多消耗了
  • *记录开发中的问题,方便以后自已回忆,2017-07-17 记录在开发一个语音的线程中,发现有如下事情,系统越来越慢,也越来越卡,打到adb shell 输 入 top 查看系统资源,发现 CPU占用率节节升高.我的去。*最终发现是线程...
  • 前面已经介绍过如何获取包名和主活动...Windows下获取APP CPU占用率 adb shell "dumpsys cpuinfo | grep com.begoit.studyplan" python脚本实现APP冷/热启动时间 #/usr/bin/python #encoding:utf-8 import...
  • CPU占用率

    2016-08-10 14:46:43
    请问android如何实现查询出CPU占用比较大的应用程序?
  • 查看CPU占用情况 第一种方法:通过top命令查看CPU的占用情况。如下例图,adb输入“top”后,可以看到: 上图中一些参数的意义: PID : progress identification,应用程序ID S : Status of progess. S for ...
  • 查看android系统中CPU占用率情况。

    万次阅读 2011-12-23 13:15:25
    $sudo ./adb shell #top  // 查看cpu占用情况。 #top -m10 // 查看cpu占用最高的10个进程。
  • 在软件开发和性能测试中,CPU占用率是一个很重要的指标,到底有哪些因素会导致CPU占用率上升呢?又有哪些手段可以降低CPU的占用率呢?本文是“Jhuster的专栏”的《实战开发经验 》系列又一篇文章,简单地总结了一下...
  • 2.CPU 利用信息 # sar -u 3.交换空间利用信息 # sar -S 4.内核表统计信息 # sar -v 5.交换信息 # sar -W 6.任务创建与系统转换信息 # sar -w 7.TTY 设备信息 # sar -y 8.队列长度和平均负载 # sar -q ...
  • linux系统或者Android平台需要查看某一个进程的内存和CPU占用率,通过如下命令进行查看。 top命令使用 top:查看所有进程 top |grep name:查看指定进程的情况 输出结果的含义 列名 含义 ...
  • 请问如何在代码中获取本应用CPU使用? 最好能贴出来代码, 并介绍下远离.
  • adb shell top -m 1 -- 显示排名第一的应用 ...PID PR CPU% S #THR VSS RSS PCY UID Name  6063 1 39% S 52 1207076K 216164K fg u0_a406 com.yanmai.ymgame.uc PID:进程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,057
精华内容 5,622
关键字:

安卓cpu占用率