【问题标题】:win32 api function to get processor's current speedwin32 api函数获取处理器的当前速度
【发布时间】:2011-11-24 12:50:58
【问题描述】:

我不知道用于查询本地 PC 处理器当前速度的 win32 api 函数。我不想使用 WMI,因为它似乎不太可能在所有 PC 上都可行。

【问题讨论】:

  • 嗨芝麻!这个问题有点含糊,但希望有人可以提供帮助。
  • 您的目标是什么版本的 Windows? WMI 的可用性仅取决于所使用的 Windows 版本,我认为...
  • 没有 API 函数可以做到这一点。甚至 WMI 也可能为处理器时钟速度提供不准确的值。我所知道的获得时钟速度的最佳程序是 CPUz。
  • 这是一个链接,示例使用 Perl - search.cpan.org/~cjohnston/Win32-SystemInfo-0.11/SystemInfo.pm
  • CPU 速度随当前工作负载快速变化,每秒可能变化很多次:您想要什么样的分辨率来监控此监控?是什么让您认为 WMI 无法在某些 PC 上运行?

标签: c++ winapi visual-c++


【解决方案1】:

一个简单的谷歌搜索把我带到了this page,看起来它有两种不同的方式来做你正在寻找的东西。

【讨论】:

  • 这两种方法都可能给出不准确的时钟速度。原因是它们都(在)直接使用处理器中的rdtsc 指令,它给出“伪”周期而不是“实际”周期。
  • QueryPerformanceCounter 实现不是通常基于 rdtsc 吗?第二种方法似乎相当多余......
【解决方案2】:

您可以(通常)使用QueryPerformanceFrequency 函数获得处理器速度。我说的是“通常”,因为此函数返回系统性能计时器组件的频率,但实际上所有当前可用的 CPU 都以与性能计时器组件相同的频率运行。

此功能从 Windows 2000 开始可用,因此很可能在当今的大多数 PC 上都支持它。

【讨论】:

  • “几乎所有当前可用的 CPU 都以与性能计时器组件相同的频率运行。” documentation 声称:“在许多情况下,QueryPerformanceFrequency 返回 TSC 频率除以 1024;在 Hyper-V 上,当来宾虚拟机在实现管理程序版本 1.0 接口的管理程序下运行时,性能计数器频率始终为 10 MHz 。”特别是对于我的系统来说,“除以 1024”的情况似乎是正确的。所以这似乎不太可靠:(
【解决方案3】:
【解决方案4】:

您可以使用参数 ProcessorInformation 调用 Windows API 函数 CallNtPowerInformation。它返回一个PROCESSOR_POWER_INFORMATION 结构,告诉您系统中每个 CPU 的当前和最大 CPU 速度。

这仅在 Win32 桌面上受支持,但 Metro 或 Windows Phone 不支持。

【讨论】:

  • 太棒了!注意:标题中仍然缺少结构定义,尽管 Microsoft 20 年前承诺:“此错误将在未来更正。同时,要编译您的应用程序,请将本主题中包含的结构定义包含在你的源代码”
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 2011-05-11
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
相关资源
最近更新 更多