首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用HyperThreading正确测量CPU的使用量?

用HyperThreading正确测量CPU的使用量?
EN

Stack Overflow用户
提问于 2015-11-25 19:20:38
回答 2查看 730关注 0票数 1

我知道这里有几个关于如何使用以下两种方法测量CPU使用情况的答案:

有几天,我很遗憾地未能用这两种机制来执行我的程序的CPU使用率测量--使用这两种机制,我得到的CPU使用量比任务管理器或Process中显示的要小。这些工具是如何做到这一点的,这与启用HyperThreading有关吗?我将在没有HyperThreding的CPU上执行我的测试,但是如果有人能指出我在这里遗漏了什么,我将非常感激。

为了说明我尝试过的内容,下面是执行基于PDH的度量的代码:

代码语言:javascript
复制
class CCpuUsageMonitor
{
public:
    CCpuUsageMonitor(const wchar_t* pProcessName)
    {

        GetSystemInfo(&m_SystemInfo);
        auto nStatus = PdhOpenQuery(NULL, NULL, &m_hPdhQuery);
        _ASSERT(nStatus == ERROR_SUCCESS);
        nStatus = PdhAddCounter(m_hPdhQuery, L"\\Processor(_Total)\\% Processor Time", NULL, &m_hPdhCpuUsageCounter);
        _ASSERT(nStatus == ERROR_SUCCESS);
        wchar_t pCounterPath[PDH_MAX_COUNTER_PATH];
        StringCbPrintf(pCounterPath, PDH_MAX_COUNTER_PATH, L"\\Process(%s)\\%% Processor Time", pProcessName);
        nStatus = PdhAddCounter(m_hPdhQuery, pCounterPath, NULL, &m_hPhdProcessCpuUsageCounter);
        _ASSERT(nStatus == ERROR_SUCCESS);
    }

    ~CCpuUsageMonitor()
    {
        PdhCloseQuery(&m_hPdhQuery);
    }

    void CollectSample()
    {
        auto nStatus = PdhCollectQueryData(m_hPdhQuery);
        _ASSERT(nStatus == ERROR_SUCCESS);
    }

    double GetCpuUsage()
    {
        DWORD nType;
        PDH_FMT_COUNTERVALUE CounterValue;
        auto nStatus = PdhGetFormattedCounterValue(m_hPdhCpuUsageCounter, PDH_FMT_DOUBLE | PDH_FMT_NOCAP100, &nType, &CounterValue);
        _ASSERT(nStatus == ERROR_SUCCESS);
        return CounterValue.doubleValue;
    }

    double GetProcessCpuUsage()
    {
        DWORD nType;
        PDH_FMT_COUNTERVALUE CounterValue;
        auto nStatus = PdhGetFormattedCounterValue(m_hPhdProcessCpuUsageCounter, PDH_FMT_DOUBLE | PDH_FMT_NOCAP100, &nType, &CounterValue);
        _ASSERT(nStatus == ERROR_SUCCESS);
        return CounterValue.doubleValue / m_SystemInfo.dwNumberOfProcessors;
    }

private:
    SYSTEM_INFO m_SystemInfo;
    HANDLE m_hPdhQuery;
    HANDLE m_hPdhCpuUsageCounter;
    HANDLE m_hPhdProcessCpuUsageCounter;
};

使用第二种方法,我基本上可以在代码运行前后通过GetProcessTimes()对进程时间进行两次快照,减去并除以墙时间乘以处理器的数量。

EN

回答 2

Stack Overflow用户

发布于 2015-11-25 21:48:10

下面是我在过去使用过的几个链接和一篇关于GetThreadTimes错误的好文章(我不会将它用作可靠的数据源):

http://blog.kalmbachnet.de/?postid=28

https://msdn.microsoft.com/en-us/library/aa392397(VS.85).aspx

http://www.drdobbs.com/windows/win32-performance-measurement-options/184416651

https://msdn.microsoft.com/en-us/library/aa394279(VS.85).aspx

你在路上看上去很好,知道这些链接至少会让你朝着正确的方向前进。

票数 1
EN

Stack Overflow用户

发布于 2022-01-28 15:52:24

来自此链接

从Windows 8开始,对任务管理器和性能监视器报告CPU利用率的方式进行了更改. 此更改影响计算CPU利用率的方式。任务管理器中的值现在对应于处理器信息处理器实用程序处理器信息特权实用程序性能计数器,而不是处理器信息处理器时间处理器信息特权时间计数器。

您的代码将以书面形式工作,而不是正在查询计数器的更改。您正在使用处理器计数器;您应该切换到在Windows 8中启用的处理器信息;还应该使用计数器的“实用程序”版本。

如果像当前一样查询格式化的值,您将在任务管理器上显示相同的编号,并进行1秒轮询。

如果要在较长的时间间隔内进行计算,可以将原始值查询到PDH_RAW_COUNTER结构中,而不是当前的PDH_FMT_COUNTERVALUE中。用于计算分子用法的值位于PDH_RAW_COUNTER结构的FirstValue中,分母的“基”值以SecondValue表示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33924794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档