Messung der Ausführungszeit in der Multithreading-Umgebung

9

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.

%Vor%

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?

    
Kornelije Petak 12.12.2011, 14:02
quelle

4 Antworten

4

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.

    
Timothy Khouri 12.12.2011, 14:13
quelle
1

Hier ist ein schöner Artikel. Sie können es verwenden oder Sie können diese Zeiten mit dem integrierten Leistungsanalysator in VS2010 vergleichen.

    
Sampath 12.12.2011 14:18
quelle
0

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%     
Steven Muhr 12.12.2011 14:09
quelle
0

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."

    
Petar Ivanov 20.10.2012 00:08
quelle