【问题标题】:How to detect CPU speed on Windows 64bit?如何检测 Windows 64 位的 CPU 速度?
【发布时间】:2008-12-03 09:43:08
【问题描述】:

我从这里“http://www.boyet.com/Articles/CodeFromInternet.html”找到了以下代码。
它以 GHz 为单位返回 CPU 的速度,但仅适用于 32 位 Windows。

using System;
using System.Management;

namespace CpuSpeed
{
    class Program
    {
        static double? GetCpuSpeedInGHz()
        {
            double? GHz = null;
            using (ManagementClass mc = new ManagementClass("Win32_Processor"))
            {
                foreach (ManagementObject mo in mc.GetInstances())
                {
                    GHz = 0.001 * (UInt32) mo.Properties["CurrentClockSpeed"].Value;
                    break;
                }
            }
            return GHz;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("The current CPU speed is {0}", (GetCpuSpeedInGHz() ?? -1.0).ToString());
            Console.ReadLine();
        }
    }
}


我搜索了 64 位管理类,但没有成功。
有没有其他方法可以在 64 位 Windows 下获得 CPU 速度?

【问题讨论】:

  • 嗯.. 是什么让您认为这只适用于 32 位 Windows?

标签: c# .net windows 64-bit cpu-speed


【解决方案1】:

下面的代码应该可以解决问题

  RegistryKey registrykeyHKLM = Registry.LocalMachine;
  string keyPath = @"HARDWARE\DESCRIPTION\System\CentralProcessor\0";
  RegistryKey registrykeyCPU = registrykeyHKLM.OpenSubKey(keyPath, false);
  string MHz = registrykeyCPU.GetValue("~MHz").ToString();
  string ProcessorNameString = (string)registrykeyCPU.GetValue("ProcessorNameString");
  registrykeyCPU.Close();
  registrykeyHKLM.Close();
  Console.WriteLine("{0} MHz for {1}", MHz, ProcessorNameString);

【讨论】:

  • 我已经重写了包含一些错误的代码,并且只返回了 CPU/代码 0 的 MHz。请参阅我的标记回复。也非常感谢您的代码。
【解决方案2】:

Binoj 提供的答案的更简单版本如下。这将返回 CPU 的最大时钟速度。请注意,如果您想要机器上的总可用周期数,您应该将此值乘以 Environment.ProcessorCount

private float GetCpuClockSpeed()
{
    return (int) Registry.GetValue(@"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "~MHz", 0);
}

【讨论】:

  • 请注意,尽管当今市场上的大多数处理器对所有内核都使用相同的时钟,但可能有些处理器不使用。您必须将所有内核的所有速度相加。
【解决方案3】:

我根据 Binoj Antony 的回答使用了以下代码,它返回每个 CPU/核心的速度,而不仅仅是第一个:

Microsoft.Win32.RegistryKey registrykeyHKLM = Microsoft.Win32.Registry.LocalMachine;
string cpuPath = @"HARDWARE\DESCRIPTION\System\CentralProcessor";
Microsoft.Win32.RegistryKey registrykeyCPUs = registrykeyHKLM.OpenSubKey(cpuPath, false);
StringBuilder sbCPUDetails = new StringBuilder();
int iCPUCount;
for (iCPUCount = 0; iCPUCount < registrykeyCPUs.SubKeyCount; iCPUCount++)
{
    Microsoft.Win32.RegistryKey registrykeyCPUDetail = registrykeyHKLM.OpenSubKey(cpuPath + "\\" + iCPUCount, false);
    string sMHz = registrykeyCPUDetail.GetValue("~MHz").ToString();
    string sProcessorNameString = registrykeyCPUDetail.GetValue("ProcessorNameString").ToString();
    sbCPUDetails.Append(Environment.NewLine + "\t" + string.Format("CPU{0}: {1} MHz for {2}", new object[] { iCPUCount, sMHz, sProcessorNameString }));
    registrykeyCPUDetail.Close();
}
registrykeyCPUs.Close();
registrykeyHKLM.Close();
sCPUSpeed = iCPUCount++ + " core(s) found:" + sbCPUDetails.ToString();

根据您的需要随意定制。

【讨论】:

  • 返回当前速度还是最大速度?
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2015-05-01
  • 2011-07-20
  • 2010-09-25
相关资源
最近更新 更多