C++: Mac環境でコア単位のCPU使用率を測定する
環境
- OS X: 10.9
コード
#include <stdio.h>
#include <unistd.h>
#include <mach/mach_host.h>
#include <mach/processor_info.h>
#include <iostream>
using namespace std;
class CpuUsage {
public:
CpuUsage(int core): core_(core) {
prev = updated_ticks_(core);
}
float get() {
Ticks t = updated_ticks_(core_);
unsigned long long int used = t.used() - prev.used();
unsigned long long int total = t.total() - prev.total();
prev = t;
return (float)used / (float)total * 100.0f;
}
private:
struct Ticks {
unsigned long long int usertime;
unsigned long long int nicetime;
unsigned long long int systemtime;
unsigned long long int idletime;
unsigned long long int used() { return usertime + nicetime + systemtime; }
unsigned long long int total() { return usertime + nicetime + systemtime + idletime; }
} prev;
int core_;
Ticks updated_ticks_(int core) {
unsigned int cpu_count;
processor_cpu_load_info_t cpu_load;
mach_msg_type_number_t cpu_msg_count;
int rc = host_processor_info(
mach_host_self( ),
PROCESSOR_CPU_LOAD_INFO,
&cpu_count,
(processor_info_array_t *) &cpu_load,
&cpu_msg_count
);
if (rc != 0) {
printf("Error: failed to scan processor info (rc=%d)\n", rc);
exit(1);
}
if (core < 0 || cpu_count <= core) {
printf("Error: invalid core number: %d\n", core);
exit(1);
}
unsigned long long int usertime = cpu_load[core].cpu_ticks[CPU_STATE_USER];
unsigned long long int nicetime = cpu_load[core].cpu_ticks[CPU_STATE_NICE];
unsigned long long int systemtime = cpu_load[core].cpu_ticks[CPU_STATE_SYSTEM];
unsigned long long int idletime = cpu_load[core].cpu_ticks[CPU_STATE_IDLE];
Ticks t = {usertime, nicetime, systemtime, idletime};
return t;
}
};
int main() {
CpuUsage a(0), b(1), c(2), d(3);
sleep(1);
printf("%6.2f, %6.2f, %6.2f, %6.2f\n", a.get(), b.get(), c.get(), d.get());
sleep(1);
printf("%6.2f, %6.2f, %6.2f, %6.2f\n", a.get(), b.get(), c.get(), d.get());
sleep(1);
printf("%6.2f, %6.2f, %6.2f, %6.2f\n", a.get(), b.get(), c.get(), d.get());
return 0;
}
(need improvement)
実行例
78.00, 72.73, 85.00, 72.00 78.00, 57.00, 72.00, 56.57 82.00, 83.00, 90.00, 88.00
0 件のコメント:
コメントを投稿