CPU利用率
内存利用率
在《Windows下使用PDH获取性能计数器(CPU、内存、网络流量等)》中介绍了通过性能计数器获取计算机性能信息,若只是获取CPU利用率及内存利用率,可以直接通过API获取。Windows提供了相关函数来获取:
-
GetSystemTimes:获取CPU的空闲、内核、用户使用时间;
-
GetProcessTimes:获取进程的内核、用户使用时间,以及创建、退出时间等;
-
GlobalMemoryStatusEx:获取内存相关的详细信息;
CPU利用率
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;
}