本文共 1998 字,大约阅读时间需要 6 分钟。
CPU利用率
内存利用率
在《》中介绍了通过性能计数器获取计算机性能信息,若只是获取CPU利用率及内存利用率,可以直接通过API获取。Windows提供了相关函数来获取:
GetSystemTimes:获取CPU的空闲、内核、用户使用时间;
GetProcessTimes:获取进程的内核、用户使用时间,以及创建、退出时间等;
GlobalMemoryStatusEx:获取内存相关的详细信息;
GetProcessTimes返回的使用时间是FILETIME格式的,获取CPU利用率只需获得一段时间内空闲时间与使用时间即可方便计算得到。为了得到当前CPU利用率,需要调用两次(间隔一段时间,如1s),然后计算其差值。
其中kernelTime中包含idleTime,所以需要减去后才能得到实际的内核使用时间。
__int64 Filetime2Int64(const FILETIME &ftime){ LARGE_INTEGER li; li.LowPart = ftime.dwLowDateTime; li.HighPart = ftime.dwHighDateTime; return li.QuadPart;}__int64 CompareFileTime2(const FILETIME &preTime, const FILETIME &nowTime){ return Filetime2Int64(nowTime) - Filetime2Int64(preTime);}double getCpuUsage(){ FILETIME preIdleTime; FILETIME preKernelTime; FILETIME preUserTime; GetSystemTimes(&preIdleTime, &preKernelTime, &preUserTime); Sleep(1000); FILETIME idleTime; FILETIME kernelTime; FILETIME userTime; GetSystemTimes(&idleTime, &kernelTime, &userTime); auto idle = CompareFileTime2(preIdleTime, idleTime); auto kernel = CompareFileTime2(preKernelTime, kernelTime); auto user = CompareFileTime2(preUserTime, userTime); if (kernel + user == 0) return 0; return 1.0*(kernel + user - idle) / (kernel + user);}
通过GlobalMemoryStatusEx获取内心相关详细信息,信息的详细结构:
typedef struct _MEMORYSTATUSEX { DWORD dwLength; DWORD dwMemoryLoad; DWORDLONG ullTotalPhys; DWORDLONG ullAvailPhys; DWORDLONG ullTotalPageFile; DWORDLONG ullAvailPageFile; DWORDLONG ullTotalVirtual; DWORDLONG ullAvailVirtual; DWORDLONG ullAvailExtendedVirtual;} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
其中dwMemoryLoad即为内存利用率。
const int Byte2MB = 1024 * 1024;void getMemoryRate() { MEMORYSTATUSEX memStatus; memStatus.dwLength = sizeof(memStatus); GlobalMemoryStatusEx(&memStatus); int nAvail = (int)(memStatus.ullAvailPhys / Byte2MB); int nTotal = (int)(memStatus.ullTotalPhys / Byte2MB); cout << "Memory: " << memStatus.dwMemoryLoad << "%, " << nAvail << "/" << nTotal << endl;}
转载地址:http://sgnlf.baihongyu.com/