如何以MHz为单位快照处理器的各个内核的速度

时间:2014-04-22 13:44:45

标签: c# .net performance clock frequency

我想创建一个应用程序,以MHz为单位监视并显示系统处理器中每个核心的频率。我见过其他应用程序这样做,例如Piriform's Speccy,所以我知道它一定是可能的。

我试过在Stack Overflow上搜索解决方案,但我找不到它。 Even this question,这是我能找到的最接近的匹配,它说的是C ++中的反作弊实现,并没有提供实际的解决方案,但有一个重要的要点this article describes:"使用电源管理技术在今天的计算机中变得越来越普遍,RDTSC指令可以不再按预期工作,这是获取高分辨率CPU时序的常用方法。有这样的想法。

我所看到的最接近的是management object has a MaxClockSpeed,但这会回应处理器的速度,而不是处理器的各个内核。

还有CPUID System Information Monitoring Kit,但这是一个开发套件,需要付出我没有的钱。

那么......现在回到手头的问题,如何以编程方式获取核心时钟速度的当前快照?必须有办法。

P.S。通过涡轮增压和其他技术,核心速度是可变的。这就是为什么我想将这些信息作为当前时间快照。出于监控目的,这样的应用程序将有助于最终用户,以便于他们检测他们的系统是否正确配置,正常工作,并允许他们监视他们的系统并查看负载下的性能等等,知道如何获取这些数据也没有坏处。

1 个答案:

答案 0 :(得分:0)

试试CallNtPowerInformation。以下是其他人的example

#include <NTstatus.h>
#define WIN32_NO_STATUS
#include <windows.h>
#include <Powrprof.h>
#include <iostream>

typedef struct _PROCESSOR_POWER_INFORMATION {
   ULONG  Number;
   ULONG  MaxMhz;
   ULONG  CurrentMhz;
   ULONG  MhzLimit;
   ULONG  MaxIdleState;
   ULONG  CurrentIdleState;
} PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;

#pragma comment(lib, "Powrprof.lib")

int main()
{
   // get the number or processors 
   SYSTEM_INFO si = {0};
   ::GetSystemInfo(&si);
   // allocate buffer to get info for each processor
   const int size = si.dwNumberOfProcessors * sizeof(PROCESSOR_POWER_INFORMATION);
   LPBYTE pBuffer = new BYTE[size]; 

   NTSTATUS status = ::CallNtPowerInformation(ProcessorInformation, NULL, 0, pBuffer, size);
   if(STATUS_SUCCESS == status)
   {
      // list each processor frequency 
      PPROCESSOR_POWER_INFORMATION ppi = (PPROCESSOR_POWER_INFORMATION)pBuffer;
      for(DWORD nIndex = 0; nIndex < si.dwNumberOfProcessors; nIndex++)
      {
         std::cout << "Processor #" << ppi->Number << " frequency: " 
            << ppi->CurrentMhz << " MHz" << std::endl;
         ppi++;
      }
   }
   else
   {
      std::cout << "CallNtPowerInformation failed. Status: " << status << std::endl;
   }
   delete []pBuffer;
   system("pause");
   return status;
}