2010-05-30 2 views
5

Как получить загрузку процессора на ядро ​​(quadcore cpu), в C#?Как я могу получить нагрузку на процессор на ядро ​​в C#?

Спасибо :)

+0

возможно дубликат [Как получить использования ЦП в C#?] (HTTP: // stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c) – chakrit

+1

Видел, что, но thats global load, мне нужен ядро ​​PER. – JustFogMaxi

+0

Я нашел это: http://www.codegain.com/articles/csharp/windowsforms/how-to-display-processor-usage-of-dual-core-processors.aspx – JustFogMaxi

ответ

7

Вы можете использовать WMI или пространство имен System.Diagnostics. Оттуда вы можете захватить любой из счетчиков производительности, которые вы хотите (однако для их инициализации требуется секунда (1-1,5 с) - значения считывания в порядке, только инициализация медленная)

Код может выглядеть следующим образом:

using System.Diagnostics; 

    public static Double Calculate(CounterSample oldSample, CounterSample newSample) 
    { 
     double difference = newSample.RawValue - oldSample.RawValue; 
     double timeInterval = newSample.TimeStamp100nSec - oldSample.TimeStamp100nSec; 
     if (timeInterval != 0) return 100*(1 - (difference/timeInterval)); 
     return 0; 
    } 

    static void Main() 
    { 
     var pc = new PerformanceCounter("Processor Information", "% Processor Time"); 
     var cat = new PerformanceCounterCategory("Processor Information"); 
     var instances = cat.GetInstanceNames(); 
     var cs = new Dictionary<string, CounterSample>(); 

     foreach (var s in instances) 
     { 
      pc.InstanceName = s; 
      cs.Add(s, pc.NextSample()); 
     } 

     while (true) 
     { 
      foreach (var s in instances) 
      { 
       pc.InstanceName = s; 
       Console.WriteLine("{0} - {1:f}", s, Calculate(cs[s], pc.NextSample())); 
       cs[s] = pc.NextSample(); 
      } 
      System.Threading.Thread.Sleep(500); 
     } 
    } 

Важно то, что вы не можете полагаться на родной .net расчета для 100nsInverse счетчиков производительности (возвращает только 0 или 100 для меня ... ошибка?), но вы должны рассчитать его самостоятельно, и для этого вам нужен архив из последних CounterSamples для каждого экземпляра (экземпляры представляют собой ядро ​​или сумму этих ядер).

Там, как представляется, именование convetion для тех случаев:

0,0 - первый процессор Первый сердечник 0,1 - первый процессор второго ядра 0, _Всего - общая нагрузка первого процессора _Total - общее нагрузка всех процессоров

(не проверено - не рекомендуем полагаться на него до тех пор пока дальнейшее исследование делается) ...

0

Поскольку ядра показаны как раздельные процессоры в ОС, вы используете один и тот же код, который вы будете использовать для определения нагрузки на ЦПУ в многопроцессорной машине. Одним из таких примеров (в C) является here. Обратите внимание, что он использует WMI, поэтому другой поток, связанный с комментариями выше, вероятно, имеет большую часть пути.

Смежные вопросы