CPU 점유율 계산
공부/프로그램 / 2013. 1. 24. 22:26
현재 사용되는 프로세스의 CPU 점유율 계산법
double XfGetTime(void)
{
LARGE_INTEGER liEndCounter,liFrequency ;
QueryPerformanceCounter(&liEndCounter);
QueryPerformanceFrequency(&liFrequency);
return (liEndCounter.QuadPart / (double)liFrequency.QuadPart) * 1000;
}
bool GetCpuShare(double &dShare) { static double oldTime = XfGetTime(); //start 상태의 가장 마지막 값을 저장한다. static __int64 iOldKernelTime=0, iOldUserTime=0; LARGE_INTEGER iCreationTime, iExitTime, iKernelTime, iUserTime; bool ret = false; if( GetProcessTimes( GetCurrentProcess() , (LPFILETIME) &iCreationTime, (LPFILETIME) &iExitTime , (LPFILETIME) &iKernelTime, (LPFILETIME) &iUserTime ) == TRUE ) { if( iOldKernelTime > 0) { __int64 sum = iKernelTime.QuadPart - iOldKernelTime + iUserTime.QuadPart - iOldUserTime; sum /= 10000; // 100 nano sec 단위에서 msec 단위로 변환 if( XfGetTime() - oldTime > 0) { dShare = sum / (XfGetTime()-oldTime) * 100.0 ; ret = true; } } iOldKernelTime = iKernelTime.QuadPart; iOldUserTime = iUserTime.QuadPart; oldTime = XfGetTime(); } return ret; }
인터넷에서 찾다보니 위와 같은 함수가 있어서 사용했는데 이상한 결과가 나오는 걸 확인했다
최종 값에 아래의 값을 가져와서 나누면 제대로된 결과가 나오는 거 같다.
(Processor 갯수만큼 나눠서 사용한다는 소리)
SYSTEM_INFO Info;
GetSystemInfo(&Info);
dShare /= Info.dwNumberOfProcessors;
참조 : http://ictlab.tistory.com/24