我知道有可能获得此信息 - 英特尔自己的 TurboBoost 侧边栏小工具似乎使用 ActiveX 控件来确定 TurboBoost 处于活动状态时 i3/i5/i7 CPU 的当前时钟速度。但是,我想在 C# 中以编程方式执行此操作 - 从 WMI 获取 CurrentClockSpeed 值以 CPU 的设置最大时钟速度达到顶峰,因此在 TurboBoost 模式下,它不会报告当前的实际时钟速度。
问问题
2216 次
2 回答
2
我不相信仅使用安全/托管的 C# 代码就可以获得此信息,因为 WMI 似乎不提供此信息。所以我认为你需要使用 CPUID 指令从执行指令的 CPU 获取详细信息。
来自英特尔的这份文档可能会帮助您入门:
http://www.intel.com/assets/pdf/appnote/241618.pdf
下面是一些与 C# 一起使用的不安全代码:
另见第 7 页:
于 2010-06-11T06:52:23.887 回答
0
如果您想获得 turbo 速度,可以使用“% Processor Performance”性能计数器并将其与 WMI“MaxClockSpeed”相乘,如下所示:
private string GetCPUInfo()
{
PerformanceCounter cpuCounter = new PerformanceCounter("Processor Information", "% Processor Performance", "_Total");
double cpuValue = cpuCounter.NextValue();
Thread loop = new Thread(() => InfiniteLoop());
loop.Start();
Thread.Sleep(1000);
cpuValue = cpuCounter.NextValue();
loop.Abort();
foreach (ManagementObject obj in new ManagementObjectSearcher("SELECT *, Name FROM Win32_Processor").Get())
{
double maxSpeed = Convert.ToDouble(obj["MaxClockSpeed"]) / 1000;
double turboSpeed = maxSpeed * cpuValue / 100;
return string.Format("{0} Running at {1:0.00}Ghz, Turbo Speed: {2:0.00}Ghz", obj["Name"], maxSpeed, turboSpeed);
}
return string.Empty;
}
InfiniteLoop 方法只是一个加减 1 的整数:
private void InfiniteLoop()
{
int i = 0;
while (true)
i = i + 1 - 1;
}
添加 InfiniteLoop 方法只是为了让 CPU 有事可做,并在此过程中加速。在获取下一个值并中止循环之前,允许循环运行一秒钟。
我还在这个问题上发布了这个答案。
于 2019-09-10T14:57:08.360 回答