2010-05-30 7 views
5

¿Cómo puedo obtener carga de CPU por núcleo (CPU quadcore), en C#?¿Cómo puedo obtener la carga de la CPU por núcleo en C#?

Gracias :)

+0

posible duplicado de [Cómo conseguir el uso de la CPU en C#?] (http: // stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c) – chakrit

+1

Visto eso, pero esa es la carga global, necesito PER core. – JustFogMaxi

+0

Lo he encontrado: http://www.codegain.com/articles/csharp/windowsforms/how-to-display-processor-usage-of-dual-core-processors.aspx – JustFogMaxi

Respuesta

7

Puede usar WMI o el espacio de nombres System.Diagnostics. Desde allí puede tomar cualquiera de los contadores de rendimiento que desee (sin embargo, tarda un segundo (1-1.5s) en inicializarlos; leer valores está bien, solo la inicialización es lenta)

El código puede verse así:

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

lo importante es que no se puede confiar en el cálculo .NET nativo para 100nsInverse contadores de rendimiento (sólo devuelve 0 o 100 para mí ... bug?), pero hay que calcular usted mismo y para eso se necesita un archivo de las últimas CounterSamples para cada instancia (las instancias representan un núcleo o una suma de esos núcleos).

Parece que hay un Convetion de nomenclatura para los casos:

0,0 - primera cpu primer núcleo 0,1 - primera cpu segundo núcleo 0, _Total - carga total de primera cpu _Total - Total la carga de todas las CPUs

(no verificado - no se lo recomendaría a confiar en ella hasta las más investigación se hace) ...

0

Desde núcleos de CPU apareces como separado del sistema operativo, que utilizan el mismo código que se usa para determinar la carga por CPU en una máquina multiprocesador. Un ejemplo de este tipo (en C) es here. Tenga en cuenta que utiliza WMI, por lo que el otro hilo enlazado en los comentarios anteriores probablemente lo lleve la mayor parte del camino hasta allí.

Cuestiones relacionadas