Почему этот метод для получения загрузки ЦП дает результаты в 2 раза ниже, чем в диспетчере задач? - PullRequest
0 голосов
/ 10 января 2019

Я использую следующий метод для определения загрузки процессора:

#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

Трудно поймать его на скриншоте, но я определенно мог видеть постоянно меньшие числа из моего кода выше.

Так мне интересно, почему такое неравенство?

PS. Процессор, на котором я тестирую, имеет 14 физических и 28 логических ядер. Может ли это как-то повлиять на вывод функции GetSystemTimes?

1 Ответ

0 голосов
/ 21 марта 2019

В Windows 10 диспетчер задач поддерживает технологию Hyper-Threading. Допустим, у вас есть 2 физических и всего 4 логических ядра. Переведите 2 ядра в режим полной загрузки, и список задач покажет 100%, а ваш метод покажет 50%, когда все 4 логических ядра заполнены, список задач по-прежнему будет отображать 100%, а затем ваш метод также покажет 100%.

...