2017-05-09 57 views
10

如何獲得與不同狀態的CPU使用率在IOS例如獲取不同狀態

1.Idle

2.Running用戶空間的iOS詳細的CPU使用率

3 。運行內核/系統

CPU使用率示例如this提供總CPU美國ge只有像下面這樣。我怎樣才能檢查使用中的不同狀態? 有什麼幫助嗎?

可用一般使用例子大多是象下面這樣:

- (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_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 nil; 
     } 

     basic_info_th = (thread_basic_info_t)thinfo; 

     if (!(basic_info_th->flags & TH_FLAGS_IDLE)) 
     { 
      //This is 0 
      tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds; 

      //This is 0 
      tot_usec = tot_usec + basic_info_th->system_time.microseconds + basic_info_th->system_time.microseconds; 

      //This is total 
      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 [NSString stringWithFormat:@"%.2f",tot_cpu]; 
} 

編輯

我也嘗試提到的示例。 here,但內核/系統讀數始終在實際設備上返回0。 這是正確的嗎?我不確定。

+0

https://stackoverflow.com/a/44123852/4417447這似乎很有幫助。嘗試這個。 – santak

+0

[iOS - 從應用程序獲取CPU使用情況]的可能重複(https://stackoverflow.com/questions/8223348/ios-get-cpu-usage-from-application) –

回答

0

試試這個Objective-C類;

獲取當前應用程序的CPU使用率SystemMonitor.cpuUsage()

獲取總的CPU使用SystemMonitor.usage()

SystemMonitor.h

#ifndef SystemMonitor_h 
#define SystemMonitor_h 
#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

typedef struct { 
    unsigned int system; 
    unsigned int user; 
    unsigned int nice; 
    unsigned int idle; 
} CPUUsage; 

@interface SystemMonitor: NSObject 
+ (CPUUsage)cpuUsage; 
+ (CGFloat)appCpuUsage; 
@end 
#endif /* SystemMonitor_h */ 

SystemMonitor.m

#import <Foundation/Foundation.h> 
#import "SystemMonitor.h" 
#import <sys/sysctl.h> 
#import <mach/mach.h> 
#import <sys/stat.h> 


@implementation SystemMonitor 


+ (CPUUsage)cpuUsage { 
    kern_return_t kr; 
    mach_msg_type_number_t count; 
    static host_cpu_load_info_data_t previous_info = {0, 0, 0, 0}; 
    host_cpu_load_info_data_t info; 

    CPUUsage usage = {0, 0, 0, 1}; 
    count = HOST_CPU_LOAD_INFO_COUNT; 

    kr = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (host_info_t)&info, &count); 
    if (kr != KERN_SUCCESS) { 
     return usage; 
    } 

    natural_t user = info.cpu_ticks[CPU_STATE_USER] - previous_info.cpu_ticks[CPU_STATE_USER]; 
    natural_t nice = info.cpu_ticks[CPU_STATE_NICE] - previous_info.cpu_ticks[CPU_STATE_NICE]; 
    natural_t system = info.cpu_ticks[CPU_STATE_SYSTEM] - previous_info.cpu_ticks[CPU_STATE_SYSTEM]; 
    natural_t idle = info.cpu_ticks[CPU_STATE_IDLE] - previous_info.cpu_ticks[CPU_STATE_IDLE]; 
    //natural_t total = user + nice + system + idle; 
    previous_info = info; 

    usage.user = user; 
    usage.system = system; 
    usage.nice = nice; 
    usage.idle = idle; 
    //return (user + nice + system) * 100.0/total; 
    return usage; 
} 

static NSUInteger const kMaxPercent = 100; 
+ (CGFloat)appCpuUsage { 
    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(), MACH_TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count); 
    if (kr != KERN_SUCCESS) { 
     return -1; 
    } 

    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; 

    // get threads in the task 
    kr = task_threads(mach_task_self(), &thread_list, &thread_count); 
    if (kr != KERN_SUCCESS) { 
     return -1; 
    } 

    long total_time  = 0; 
    long total_userTime = 0; 
    CGFloat total_cpu = 0; 
    int j; 

    // for each thread 
    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)) { 
      total_time  = total_time + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds; 
      total_userTime = total_userTime + basic_info_th->user_time.microseconds + basic_info_th->system_time.microseconds; 
      total_cpu  = total_cpu + basic_info_th->cpu_usage/(float)TH_USAGE_SCALE * kMaxPercent; 
     } 
    } 

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

    return total_cpu; 
} 

@end