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

时间:2018-07-13 20:01:47

标签: c# cpu-speed

当前正在使用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,并且可以根据需要使用其他软件包)。

2 个答案:

答案 0 :(得分:1)

在WMI对象上, MaxClockSpeed 属性为您提供核心的最大速度,该速度应保持恒定。 CurrentClockSpeed 属性可告诉您当前的时钟速度。由于CPU节流,这可能比 MaxClockSpeed 少。

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

答案 1 :(得分:0)

在可以访问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);