2010-05-30 12 views
5

Wie kann ich CPU-Last pro Kern (Quadcore-CPU) in C# bekommen?Wie kann ich die CPU-Last pro Kern in C# bekommen?

Thanks :)

+0

möglich Duplikat [So erhält die CPU-Auslastung in C#?] (http: // stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c) – chakrit

+1

Gesehen, aber Das ist eine globale Last, ich brauche PER Core. – JustFogMaxi

+0

Ich habe es gefunden: http://www.codegain.com/articles/csharp/windowsforms/how-to-display-processor-usage-of-dual-core-processors.aspx – JustFogMaxi

Antwort

7

Sie können entweder WMI oder den Namespace System.Diagnostics verwenden. Von dort können Sie einen der Leistungszähler nehmen, die Sie wünschen (es dauert jedoch eine Sekunde (1-1.5s), um diese zu initialisieren - Werte lesen ist ok, nur Initialisierung ist langsam)

Code kann dann so aussehen:

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

Wichtig ist, dass Sie auf nativer .net Berechnung für 100nsInverse Leistungsindikatoren (gibt nur 0 oder 100 für mich ... Fehler?) verlassen kann nicht, aber man muss es selbst berechnen und dafür brauchen Sie ein Archiv der letzten CounterSamples für jede Instanz (Instanzen repräsentieren einen Kern oder eine Summe dieser Kerne).

Es scheint eine Namensgebung convetion für die Fälle zu sein:

0,0 - ersten CPU erster Kern 0,1 - ersten CPU zweiter Kern 0, _Total - Gesamtlast von ersten CPU _Total - total Last aller CPUs

(nicht überprüft - auf, es wäre nicht, bis weitere Untersuchungen erfolgten verlassen empfehlen) ...

0

Da Kerne zeigen als separaten CPUs zum O, verwenden Sie den gleichen Code, den Sie verwenden würde, um die Last pro CPU in einer Multi-Prozessor-Maschine zu bestimmen. Ein solches Beispiel (in C) ist here. Beachten Sie, dass WMI verwendet wird, sodass der andere Thread, der in den obigen Kommentaren verlinkt ist, wahrscheinlich den größten Teil des Weges zurücklegt.