[英]How to get total CPU Idle Time in Objective C/C on OS X?
我需要在OS X上獲得目標C / C的總CPU空閑時間嗎?
如果可能的話請提供代碼示例。 這是我用來獲取這些指標的代碼。 結果百分比與我在Activity Monitor中的百分比不同。 所以我假設CPU時間計算不正確:
#include <sys/sysctl.h>
#include <sys/types.h>
#include <mach/mach.h>
#include <mach/processor_info.h>
#include <mach/mach_host.h>
- (void)printCPUUsage
{
processor_cpu_load_info_t cpuLoad;
mach_msg_type_number_t processorMsgCount;
natural_t processorCount;
uint64_t totalSystemTime = 0, totalUserTime = 0, totalIdleTime = 0, totalCPUTime = 0;
kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &processorCount, (processor_info_array_t *)&cpuLoad, &processorMsgCount);
for (natural_t i = 0; i < processorCount; i++) {
// Calc load types and totals, with guards against 32-bit overflow
// (values are natural_t)
uint64_t system = 0, user = 0, idle = 0, total = 0;
system = cpuLoad[i].cpu_ticks[CPU_STATE_SYSTEM];
user = cpuLoad[i].cpu_ticks[CPU_STATE_USER];
idle = cpuLoad[i].cpu_ticks[CPU_STATE_IDLE];
total = system + user + idle;
if (total < 1) {
total = 1;
}
totalCPUTime += total;
totalSystemTime += system;
totalUserTime += user;
totalIdleTime += idle;
}
double onePercent = totalCPUTime/100.0f;
NSLog(@"system: %f", (double)totalSystemTime/(double)onePercent);
NSLog(@"user: %f", (double)totalUserTime/(double)onePercent);
NSLog(@"idle: %f", (double)totalIdleTime/(double)onePercent);
}
默認情況下,從過程儀表或頂部返回的值基於樣本增量,即它們計算自上一個樣本以來的CPU使用率,而不是絕對值。
這對應於在模式中調用時選項-cn
to top:
top -c n -l 0 | head -5
這是默認模式。 如果您想要在代碼中返回的值,那么您需要使用以下示例將值基於立即樣本:
top -c e -l 0 | head -5
這些值將與您看到的值相對應。
如果要獲得與過程儀表/頂部相似的值,則需要采用兩個樣本,並顯示它們之間差異的值。
例如,我們創建一個包含統計信息的結構:
struct cpusample {
uint64_t totalSystemTime;
uint64_t totalUserTime;
uint64_t totalIdleTime;
};
我們改變printCPUUsage調用,以便它執行一個示例:
void sample(struct cpusample *sample)
{
processor_cpu_load_info_t cpuLoad;
mach_msg_type_number_t processorMsgCount;
natural_t processorCount;
uint64_t totalSystemTime = 0, totalUserTime = 0, totalIdleTime = 0;
kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &processorCount, (processor_info_array_t *)&cpuLoad, &processorMsgCount);
for (natural_t i = 0; i < processorCount; i++) {
// Calc load types and totals, with guards against 32-bit overflow
// (values are natural_t)
uint64_t system = 0, user = 0, idle = 0;
system = cpuLoad[i].cpu_ticks[CPU_STATE_SYSTEM];
user = cpuLoad[i].cpu_ticks[CPU_STATE_USER] + cpuLoad[i].cpu_ticks[CPU_STATE_NICE];
idle = cpuLoad[i].cpu_ticks[CPU_STATE_IDLE];
totalSystemTime += system;
totalUserTime += user;
totalIdleTime += idle;
}
sample->totalSystemTime = totalSystemTime;
sample->totalUserTime = totalUserTime;
sample->totalIdleTime = totalIdleTime;
}
然后我們采取兩個樣本(樣本之間1秒):
struct cpusample delta;
sample(&sample1);
sleep(1);
sample(&sample2);
deltasample.totalSystemTime = sample2.totalSystemTime - sample1.totalSystemTime;
deltasample.totalUserTime = sample2.totalUserTime - sample1.totalUserTime;
deltasample.totalIdleTime = sample2.totalIdleTime - sample1.totalIdleTime;
添加printample代碼:
void printSample(struct cpusample *sample)
{
uint64_t total = sample->totalSystemTime + sample->totalUserTime + sample->totalIdleTime;
double onePercent = total/100.0f;
NSLog(@"system: %f", (double)sample->totalSystemTime/(double)onePercent);
NSLog(@"user: %f", (double)sample->totalUserTime/(double)onePercent);
NSLog(@"idle: %f", (double)sample->totalIdleTime/(double)onePercent);
}
因此,當您調用printSample(&deltasample)
它會打印增量記錄,這會提供與top
或Activity Monitor
呈現的值更相似的值。
但說實話,我使用host_statistics
,因為代碼更清晰:
void sample(struct cpusample *sample)
{
kern_return_t kr;
mach_msg_type_number_t count;
host_cpu_load_info_data_t r_load;
uint64_t totalSystemTime = 0, totalUserTime = 0, totalIdleTime = 0;
count = HOST_CPU_LOAD_INFO_COUNT;
kr = host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, (int *)&r_load, &count);
if (kr != KERN_SUCCESS) {
printf("oops: %s\n", mach_error_string(kr));
return;
}
sample->totalSystemTime = r_load.cpu_ticks[CPU_STATE_SYSTEM];
sample->totalUserTime = r_load.cpu_ticks[CPU_STATE_USER] + r_load.cpu_ticks[CPU_STATE_NICE];
sample->totalIdleTime = r_load.cpu_ticks[CPU_STATE_IDLE];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.