Ich habe eine Anwendung, die Task
(TPL) -Objekte für die asynchrone Ausführung verwendet.
Der Haupt-Thread wartet auf einen Trigger (irgendein TCP-Paket) und führt dann mehrere Aufgaben aus. Was ich tun möchte, ist die Zeit in den Aufgaben zu messen.
Sehen Sie sich den Code an. Ich habe eine längere Operation ( Generator
), eingeschlossen in Stopwatch's
start / stop.
Hier ist das Problem. Stoppuhr verwendet DateTime.UtcNow.Ticks
im Moment von Start()
und dann wieder im Moment von Stop()
. Dann subtrahiert er diese zwei, um die verstrichene Zeit zu erhalten.
Die Sache ist, ein anderer Thread (in einem Single-Thread-System) kann etwas Prozessorzeit bekommen, während der Generator
(aus dem Code) seine GenerateIntervals()
langwierige Operation ausführt. Das bedeutet, dass die von der Stoppuhr aufgezeichnete Zeit nicht nur die Generaor.GenerateIntervals()
-Zeit, sondern auch die Zeit, in der die anderen Threads dazwischen gearbeitet haben, enthält.
Gibt es eine einfache Möglichkeit, genau zu wissen, wie viel Prozessorzeit eine Methode in Anspruch nahm, ohne Ausführungszeit von anderen Threads als Folge von Timesharing-Mechanismen?
Die Antwort auf Ihre Frage lautet "Nein" ... Nein, Sie können die akkumulierte Zeit AN DER CPU für eine bestimmte thread
nicht messen.
(Seitenschrei: Ich wünschte wirklich, die Leute würden die Frage lesen und verstehen, bevor sie antworten !!!)
Ok, zurück zu Ihrer Frage ... die genaueste Sache, die Sie tun könnten, wäre, eine separate process
für jede Ihrer Aufgaben auszugeben und dann die CPU-Zeit für den Prozess zu messen (was in .Net) ... aber das ist Overkill.
Wenn Sie Hilfe dazu benötigen, sollten Sie speziell dafür eine andere Frage stellen.
Sie können die Methoden QueryPerformanceCounter () von Windows API und QueryPerformanceFrequency () verwenden, um die Anzahl der Millisekunden abzurufen, die seit dem Start des Timers verstrichen sind.
%Vor%Tatsächlich ist die Antwort JA (aber Sie müssen Interop verwenden).
Es gibt eine WINAPI-Funktion namens QueryThreadCycleTime und tut genau das:
"Ruft die Zykluszeit für den angegebenen Thread ab."
Tags und Links c# multithreading time-measurement