测量CPU使用率的代码返回不一致的结果(对于超频的CPU)

时间:2015-08-13 03:51:42

标签: c++ c windows winapi cpu-usage

我对下面显示的代码有一些奇怪的行为。重复调用此代码以测量应用程序中的当前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会被超频。

0 个答案:

没有答案