Laden...

Berechnung der CPU-Zeit eines Code-Abschnitts

Erstellt von SlyFox vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.281 Views
S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 10 Jahren
Berechnung der CPU-Zeit eines Code-Abschnitts

Hallo,

ich möchte gerne wissen, wie viel CPU-Zeit ein Programmteil benötigt. Es handelt sich um eine Programmschleife, die sehr oft durchlaufen wird.

Ich würde gerne verschiedene Varianten ausprobieren, um dann die schnellste zu nutzen.

Zu DOS-Zeiten habe ich dazu einfach zweimal System-Zeit ausgelesen, das war einfach. Mit Windows und Multi-Tasking ist das jedoch viel komplizierter geworden.

Was ich gefunden habe, ist System.Diagnostics.PerformanceCounter. Leider habe ich aber nur Beispiele gefunden, bei denen man die aktuelle CPU-Auslastung ermitteln konnte, was mich aber nicht weiter bringt.

Ich möchte gerne wissen, wie viele Sekunden mein Programm die CPU auslastet (auf 100 % umgerechnet). Wenn mein Programm also 5 Sekunden lang die CPU zu 20 % auslastet, soll das Ergebnis 1 Sekunde sein.

Gibt es dafür eine Methode?

Vielen Dank für eure Unterstützung und frohes neues Jahr

Christoph

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo SlyFox,

für solche Messungen gibt es ==> Profiler.

herbivore

771 Beiträge seit 2009
vor 10 Jahren

Nimm doch einfach die Stopwatch-Klasse (die verwendet intern auch den PerformanceCounter).

Btw. ein Programm lastet die CPU (bzw. einen Core) immer zu 100% aus (solange man nicht selber den Thread schlafenlegt, z.B. mit Sleep(), WaitForEvent(), Locks o.ä.).

16.842 Beiträge seit 2008
vor 10 Jahren

Btw. ein Programm lastet die CPU (bzw. einen Core) immer zu 100% aus

Äh.. nö.

Wenn für die Operation andere Ressourcen benötigt werden, zB Einlesen von Dateien kann es gut sein bzw. wird es so sein, dass der Flaschenhals nicht das 100%-Limit der CPU ist, sondern eben der IO-Bus (oder irgendeine andere Quelle).
Dazu kommt auch noch Scheduling und Co...

5.742 Beiträge seit 2007
vor 10 Jahren

Hallo SlyFox,

insbesondere solltest du beachten, dass du in der **Release **Konfiguration **ohne **angehängten Debugger misst. Sonst verzerrt das ganz schnell das Ergebnis...

Noch ein paar andere Punkte, auf die du beim (manuellen) Messen achten solltest (IMHO ist ein Profiler sehr gut, um einen Überblick über die Gesamtperformance zu erhalten; Optimieren kann man dann am besten mittels direktem Vergleich von Codeschnippseln):*Mehrfach messen - ruhig ein paar tausend mal und dann die beste Zeit und den Durchschnitt betrachten *Vor jedem Test GC.Collect() aufrufen (damit keine GC dazwischenkommt) *Vor jedem Test Thread.Sleep(0) aufrufen (damit der Test möglichst in einer Zeitscheibe durchrennt) *Priorität des Prozesses auf "High" setzen (damit du möglichst lange Rechenzeit zugeteilt bekommst) *Keine andere Software nebenher laufen lassen (ok , sollte eigentlich selbstverständlich sein) *Vor der eigentlichen Messung "aufwärmen", d.h. erstmal allen Code einmal aufrufen, sodass der JIT-Compiler seine Aufgaben erledigen kann *Berechnungen der Zeiten erst nach dem Stoppen der Stopwatch durchführen *Affinität des Threads auf einen Core setzen (den im Idealfall keine anderen Prozesse / Threads) zugeordnet sind.