2008-12-03 2 views
2

Я нашел следующий код отсюда «http://www.boyet.com/Articles/CodeFromInternet.html».
Он возвращает скорость процессора в ГГц, но работает только на 32-битной Windows.Как определить скорость процессора на Windows 64bit?

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?

+1

Uhm .. что заставляет вас думать, что это работает только на 32-битной Windows? – 2011-10-07 07:32:04

ответ

-1

Я использовал следующий код, основанный на ответ по Binoj Антонием, который возвращает скорость для каждого процессора/ядра, а не только первый одно:

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(); 

Не стесняйтесь настраивать его для ваших нужд.

+0

это возвращает текущую скорость или максимальную скорость? – 2009-03-17 10:53:35

6

Код ниже должен сделать трюк

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); 
+0

Я переписал код, содержащий некоторые ошибки, и возвратил только МГц для CPU/code 0. См. Мой отмеченный ответ. Большое спасибо за ваш код. – Marc 2009-03-16 15:00:37

0

Простая версия ответа, предоставленного Binoj, будет следующей. Это вернет максимальную тактовую частоту вашего процессора. Обратите внимание, что если вы хотите, чтобы на вашем компьютере были доступны все доступные циклы, вы должны умножить это значение на Environment.ProcessorCount.

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

Обратите внимание, что, хотя большинство современных процессоров используют одни и те же часы для всех ядер, но могут быть и такие, которые этого не делают. вы должны суммировать все скорости для всех ядер. – Dani 2011-08-17 15:54:09