代码之家  ›  专栏  ›  技术社区  ›  c00000fd

为什么这种获取cpu利用率的方法产生的结果比任务管理器的结果低2倍?

  •  0
  • c00000fd  · 技术社区  · 6 年前

    我正在使用以下方法检测CPU利用率:

    #include "pch.h"
    #include <iostream>
    #include <Windows.h>
    
    int get_CPU_Usage(void);
    
    
    int main()
    {
        COORD c = {0};
        HANDLE hStdOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
    
        for(;; ::Sleep(500))
        {
            ::SetConsoleCursorPosition(hStdOut, c);
            wprintf(L"Current CPU usage: %d%%\t\t\n", get_CPU_Usage());
        }
    
    }
    
    
    
    
    int get_CPU_Usage(void)
    {
        //RETURN: = CPU Usage in percent [0 - 100], or
        //        = -1 if error
        int nRes = -1;
    
        //Run system function
        FILETIME ftIdle, ftKrnl, ftUsr;
        if(::GetSystemTimes(&ftIdle, &ftKrnl, &ftUsr))
        {
            //Now calculate value
            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;
    
            //Only if we have previous values
            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));
    
                    //Check value and correct it (Just in case)
                    if(nRes < 0)
                        nRes = 0;
                    else if(nRes > 100)
                        nRes = 100;
                }
            }
    
            //Remember data
            bUsedOnce = TRUE;
            uOldIdle = uIdle;
            uOldKrnl = uKrnl;
            uOldUsr = uUsr;
        }
    
        return nRes;
    }
    

    它以前在我运行windows 8.1的旧计算机上提供类似的阅读,但现在当我在这个桌面上运行它时 Intel(R) Core(TM) i9-7940X CPU @ 3.10GHz 在Windows 10 Pro上,它给出的结果似乎比任务管理器显示的结果低2倍:

    enter image description here

    用截图很难捕捉到它,但从上面的代码中,我绝对可以看到更低的数字。

    所以我想知道,为什么如此悬殊?

    我正在测试的CPU有14个物理核和28个逻辑核。这会不会影响 GetSystemTimes 功能?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Siim    6 年前

    在Windows 10中,任务管理器支持超线程。假设您有2个物理核,总共有4个逻辑核。在满负荷下放置2个核心,tasklist将显示100%,而您的方法将显示50%,当所有4个逻辑核心都已填充时,tasklist仍将显示100%,然后您的方法也将显示100%。