CPU 사용률 및 CPU 사용률 계산

설명


우리는 개발 중에 응용 프로그램이 차지하는 CPU 비율과 CPU 사용률을 읽어야 할 수도 있다.이 글은 주로 이 두 가지 이용률의 개념과 이 두 가지 이용률을 어떻게 얻는지 소개한다.
cpu 총량 = 본 응용 프로그램이 차지하는 공간 + 기타 응용 프로그램이 차지하는 공간 + 빈 공간
응용 프로그램 점유율: 본 응용 프로그램이 있는 cpu의 점유율 cpu의 사용률: 현재 핸드폰 cpu의 사용률 = 본 응용 프로그램의 사용률 + 기타 응용 프로그램의 사용률

코드


1. 응용 프로그램이 차지하는 cpu의 백분율 가져오기: 다음 라이브러리를 가져옵니다.
#import <mach/mach.h>

세부 코드:
/** * Get cpu usage app level * *  @return cpu usage */
+ (float)getCpuUsageAppLevel
{
    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 < 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;
}

우리는 xcode의 cpu 이용 비율과 비교할 수 있는데, 그 값은 비교적 가깝다.
2. 휴대폰 cpu의 사용률 1) 주 스레드에서 다음 라이브러리 가져오기를 계산합니다.
#import <mach/mach.h>
#import <sys/sysctl.h>
#import <sys/types.h>
#import "AppCalculator.h"

선언해야 하는 속성:
 processor_info_array_t _cpuInfo, _prevCPUInfo;
 mach_msg_type_number_t _numCPUInfo, _numPrevCPUInfo;
 unsigned _numCPUs;
/** * Get cpu usage phone level * *  @return cpu usage */
- (float)getCpuUsagePhoneLevel
{
    float cpuusageRes = 0.00f;
    int _mib[2U] = { CTL_HW, HW_NCPU };
    size_t _sizeOfNumCPUs = sizeof(_numCPUs);
    int _status = sysctl(_mib, 2U, &_numCPUs, &_sizeOfNumCPUs, NULL, 0U);
    if(_status)
        _numCPUs = 1;

    // _cpuUsageLock = [[NSLock alloc] init];

    natural_t _numCPUsU = 0U;
    kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &_numCPUsU, &_cpuInfo, &_numCPUInfo);
    if(err == KERN_SUCCESS) {
        // [_cpuUsageLock lock];

        for(unsigned i = 0U; i < _numCPUs; ++i) {
            Float32 _inUse, _total;
            if(_prevCPUInfo) {
                _inUse = (
                          (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER]   - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER])
                          + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM])
                          + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]   - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE])
                          );
                _total = _inUse + (_cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - _prevCPUInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]);
            } else {
                _inUse = _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE];
                _total = _inUse + _cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE];
            }

            if (_total != 0) {
                cpuusageRes += _inUse / _total;
            }
            // NSLog(@"Core : %u, Usage: %.2f%%", i, _inUse / _total * 100.f);
        }
        // [_cpuUsageLock unlock];

        if(_prevCPUInfo) {
            size_t prevCpuInfoSize = sizeof(integer_t) * _numPrevCPUInfo;
            vm_deallocate(mach_task_self(), (vm_address_t)_prevCPUInfo, prevCpuInfoSize);
        }

        _prevCPUInfo = _cpuInfo;
        _numPrevCPUInfo = _numCPUInfo;

        _cpuInfo = nil;
        _numCPUInfo = 0U;
    } else {
        // NSLog(@"Error!");
    }
    return cpuusageRes * 100;
}

2) cpu 이용률을 계산하는 코드를 비주 라인에 넣고 코드 연결을 계산한다http://download.csdn.net/download/smiling8866/9475124코드에서 먼저 호출-(void)createCpuusagePhoneLevel 방법으로 cpu 이용률을 계산한 다음에 호출-(float)getcpuusagePhoneLevel 방법으로 값을 받아야 합니다.주의: 코드 이상 등 세부 사항을 주의하십시오.

좋은 웹페이지 즐겨찾기