C#:如何找到CPU的当前时钟速度?



目前正在c#/wpf中创建一种"任务管理器"。我到处找了找,但没有找到解决问题的办法。

我正在尝试检索一个人的CPU的当前时钟速度(而不是利用率、基本值、最小值/最大值(。我尝试过使用ManagementObjects,但"CurrentClockSpeed"总是给出3400或3.4GHz的固定值,这是CPU的最高速度。我已经试过很多次了,它给了我同样的答案,所以我认为这不仅仅是巧合。

ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
uint sp = (uint)(Mo["CurrentClockSpeed"]);
System.Threading.Thread.Sleep(1000);
sp = (uint)(Mo["CurrentClockSpeed"]);
Mo.Dispose(); //return and such later in the code

任何关于如何解决此问题的建议(我不一定要使用ManagementObjects,我有OpenHardwareMonitor,如果需要,可以使用其他包(都将不胜感激。

在WMI对象上,MaxClockSpeed属性提供内核的最大速度,该速度应该是恒定的。CurrentClockSpeed属性告诉当前时钟速度。这可能比MaxClockSpeed由于cpu节流而导致的速度慢。

我相信您可以在BIOS级别或通过Windows电源管理控制面板小程序禁用节流,因此*CurrentClockSpeed**可能始终与MaxClockSpeed相同

我在你之前八年就有过同样的问题。WMI不会返回实际的当前时钟速度,至少在Windows 10中,情况似乎仍然如此。

无论出于何种原因,WMI只返回基本时钟速度作为最大和当前时钟速度的值。这不是CPU支持的问题;CPU-Z能够报告正确的时钟速度,任务管理器也是如此。这是操作系统可以支配的一段数据,但并不容易获得。可能有一种方法可以使用C++从CPU中获得确切的值,但许多开发人员并不精通这种语言。

这个很棒的答案对我来说非常有效!在2010年启动(并放弃(这个应用程序后,我终于让它正常工作了。

(附言:这在Windows7中不起作用;当时使用的perfmon计数器似乎不存在。(

在可访问MSR的Intel CPU上运行代码时,您可以从IA32_MPERF (0xE7)TSC频率时钟计数器和IA32_APERF (0xE8)实际性能时钟计数器。

aperf_t1 = read_aperf();
mperf_t1 = read_mperf();
sleep(1);   
aperf_t2 = read_aperf();
mperf_t2 = read_mperf();
printf("CPU freq: %f [Hz]n", ((aperf_t2-aperf_t1) / (double)(mperf_t2-mperf_t1)) * nominal_freq);

最新更新