gpt4 book ai didi

c++ - 使用超线程正确测量 CPU 使用率?

转载 作者:行者123 更新时间:2023-11-28 05:57:10 25 4
gpt4 key购买 nike

我知道这里有几个关于如何使用两种方法之一测量 CPU 使用率的答案:

几天来,我无法使用其中任何一种方法对我的程序执行 CPU 使用率测量,这让我很遗憾 - 使用这两种机制,我得到的 CPU 使用率小于任务管理器或进程资源管理器中显示的值。这些工具是如何做到这一点的,这是否与启用超线程有关?我将在没有 HyperThreding 的 CPU 上执行我的测试,但如果有人能指出我在这里遗漏了什么,我将非常感激。

为了说明我的尝试,这里是执行基于 PDH 的测量的代码:

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() 拍摄了两个处理时间快照。在我的代码运行前后,减去并除以墙上时间乘以处理器数量。

最佳答案

这里有一些我过去使用过的链接和一篇关于为什么 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

您看起来进展顺利并且知识渊博,这些链接至少应该让您朝着正确的方向前进。

关于c++ - 使用超线程正确测量 CPU 使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33924794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com