如何在MacOS上的Objective-C/C中获取总CPU空闲时间?
下面是我用来获取这些指标的代码。由于结果百分比是不一样的,我在活动监视器。所以我假设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);
}
字符串
1条答案
按热度按时间hujrc8aj1#
默认情况下,从过程 Jmeter 或顶部返回的值基于样本增量,即它们计算自上一个样本以来的CPU使用率,而不是绝对值。
这对应于在模式下调用时选项
-c n
to top:字符串
这是默认模式。如果您想要在代码中返回的值,那么您需要基于立即的示例值,使用:
型
这些值将与您看到的值相对应。
如果你想得到类似的值,以过程 Jmeter /顶部,那么你需要采取两个样本,并显示它们之间的差异值。
例如,我们创建一个包含stats的结构:
型
我们改变printCPUUsage调用,以便执行一个示例:
型
然后我们取两个样本(样本之间1秒):
型
添加printsample代码:
型
因此,当调用
printSample(&deltasample)
时,它会打印增量记录,它给出的值与top
或Activity Monitor
所提供的值更相似。但老实说,我会使用
host_statistics
,因为代码更简洁:型