2016-04-11 13 views
-1

Ich stieß auf ein anderes Verhalten bei der Berechnung der CPU-Auslastung. In meinem Code verwende ich Leistungsindikator "Prozessorzeit", Instanz "_Total" und es scheint in Ordnung zu funktionieren (Windows-Leistungsmonitor zeigen den gleichen Wert, Sysinternals Process Explorer als auch) , aber integrierten Task-Manager in Windows 8 oder 10 zeigt viel weniger, wenn die Leistungsoptionen die CPU-Geschwindigkeit und die CPU zu einem bestimmten Zeitpunkt mit einer niedrigeren Frequenz ermöglichen.CPU-Auslastung und CPU-Geschwindigkeit

Gibt es eine C# von C-Funktion, Perf. Zähler .. um diesen (Task-Manager) -Wert, , zu liefern oder die aktuelle CPU-Frequenz zu lesen und irgendwie zu berechnen?

+0

Mit _Total und somit die Prozessorzeit für * alle * Prozesse statt nur verkaufen, verwendet erhalten, ist ziemlich ungewöhnlich und nicht das, was Task-Manager zeigt in seiner Registerkarte Prozesse . Die Kategorie zählt, es gibt "Prozessor" und "Prozessorinformationen". Der Task-Manager verwendet Letzteres, es ist eine neuere Zählerkategorie, die versucht, variable Taktraten und Hyper-Threading zu kompensieren. Der beste Weg ist sicherlich, Ihrem Programm keine Dodah hinzuzufügen, die ohne Hilfe trivial sichtbar ist. –

+0

danke, aber Kategorie "Prozessor" und "Prozessor Information" gibt mir die gleichen Zahlen, auch CPU läuft mit etwa halber Frequenz. – user2136076

Antwort

0

Wenn jemand diese Anforderung konfrontiert sein wird, möchte ich Ihnen zeigen, wie ich es endlich gelöst:

Anscheinend ist der Windows 8 enthält einen Leistungsmonitor-Zähler namens „% Prozessor-Utility“. Und das ist die, die im Task-Manager von Win 8 und Win 10 als CPU-Auslastung angezeigt wird. Dieser Zähler im Gegensatz zu "% Prozessorzeit", der normalerweise zur Anzeige der CPU-Auslastung verwendet wird, berücksichtigt die ausgeglichene CPU-Geschwindigkeit.

% Prozessor-Dienstprogramm ist die Menge der Arbeit, ein Prozessor, der als Prozentsatz der Menge an Arbeit, der Prozessor vervollständigen könnte, wenn es in seiner nominalen Leistung ausgeführt wurde und nie Leerlauf absolviert. Auf einigen Prozessoren kann das Prozessor-Dienstprogramm 100% überschreiten.

In C# Code-Schnipsel:

PerformanceCounter _cpuCounter = new PerformanceCounter("Processor Information", "% Processor Utility", "_Total"); 
CounterSample firstValue = _cpuCounter.NextSample(); 
Thread.Sleep(500); 
CounterSample secondValue = _cpuCounter.NextSample(); 
    string cpuUsage = CounterSample.Calculate(firstValue, secondValue).ToString("0.0"); 
Verwandte Themen