我对下面显示的代码有一些奇怪的行为。重复调用此代码以测量应用程序中的当前CPU使用率(所有 CPU内核的测量值):
int get_CPU_Usage(void)
{
//RETURN: = CPU Usage in percent [0 - 100], or
// = -1 if error
int nRes = -1;
FILETIME ftIdle, ftKrnl, ftUsr;
if(GetSystemTimes(&ftIdle, &ftKrnl, &ftUsr))
{
static BOOL bUsedOnce = FALSE;
static ULONGLONG uOldIdle = 0;
static ULONGLONG uOldKrnl = 0;
static ULONGLONG uOldUsr = 0;
ULONGLONG uIdle = ((ULONGLONG)ftIdle.dwHighDateTime << 32) | ftIdle.dwLowDateTime;
ULONGLONG uKrnl = ((ULONGLONG)ftKrnl.dwHighDateTime << 32) | ftKrnl.dwLowDateTime;
ULONGLONG uUsr = ((ULONGLONG)ftUsr.dwHighDateTime << 32) | ftUsr.dwLowDateTime;
if(bUsedOnce)
{
ULONGLONG uDiffIdle = uIdle - uOldIdle;
ULONGLONG uDiffKrnl = uKrnl - uOldKrnl;
ULONGLONG uDiffUsr = uUsr - uOldUsr;
if(uDiffKrnl + uDiffUsr)
{
//Calculate percentage
nRes = (int)((uDiffKrnl + uDiffUsr - uDiffIdle) * 100 / (uDiffKrnl + uDiffUsr));
}
}
bUsedOnce = TRUE;
uOldIdle = uIdle;
uOldKrnl = uKrnl;
uOldUsr = uUsr;
}
return nRes;
}
我在我的几台PC上测试了它,代码似乎返回了可靠的结果。不幸的是,在一台机器上,上面的代码似乎产生的结果比任务管理器的读数低20%(即,任务管理器将显示100%的CPU利用率,而我的代码将始终仅返回80 %。)
该机器上的CPU细节:
Intel(R) Core(TM) i7
Cores: 4
Logical CPUs: 8
NUMA nodes: 1
有没有人知道为什么这段代码会出现如此错误的阅读?
编辑: PS。事实证明,产生这种错误结果的CPU会被超频。