2009-07-19 5 views
8

fand ich eine gute question für Funktionsleistung zu messen, und die Antworten empfehlen Stoppuhr zu verwenden, wieBest Practice für Stoppuhr in Multi-Prozessoren-Maschine?

folgt
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
//DoWork 
sw.Stop(); 
//take sw.Elapsed 

Aber gilt dies, wenn Sie unter mehreren Prozessoren Computer ausgeführt werden? Der Thread kann auf einen anderen Prozessor umgeschaltet werden, oder? Auch das gleiche sollte in Enviroment.TickCount sein. Wenn die Antwort ja sollte ich meinen Code in BeginThreadAffinity wickeln als

Thread.BeginThreadAffinity(); 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
//DoWork 
sw.Stop(); 
//take sw.Elapsed 
Thread.EndThreadAffinity(); 

PS folgt

Die Umschaltung der Thread-Ebene auftreten, können die Prozessorebene nicht nur zum Beispiel, wenn die Funktion in einem anderen läuft thread so das System kann es zu einem anderen Prozessor wechseln, wenn das passiert, wird die Stoppuhr nach diesem Wechsel gültig sein?

Ich bin nicht Stoppuhr für perfromance Messung mit nur aber auch Timer-Funktion Thread.Sleep (verhindern Anruf überlappend)

Antwort

5

Wenn die Funktion selbst nicht multithreaded (zB es nicht laichen andere Threads zu simulieren/Prozesse und warten auf sie zu vervollständigen) dann ist das einzige Problem Ihre Maschine.

Wenn Ihr Computer mit anderen Dingen beschäftigt ist, kann Ihr Test ungültig werden (z. B. Kodierung eines H.264-Videos bei einem CPU-gebundenen Test). Wenn Sie den gesamten physischen Speicher verwenden, um etwas zu testen, das an den Speicher gebunden ist, kann dies ebenfalls Ihre Ergebnisse ungültig machen.

Das allgemeine Prinzip ist, dass die Maschine bei der Durchführung solcher Tests unter einer minimalen bis normalen Belastung stehen sollte. Ansonsten gibt es kein Multiprocessing-Problem. Ja, das Programm könnte Kerne austauschen, während es läuft, aber der Aufwand dafür ist entweder ein kleiner Prozentsatz Ihrer gemessenen Zeit oder die gemessene Zeit ist so klein, dass die Granularität der Zeitmessung des Systems ein Problem ist.

+0

Wenn die Funktion in einem Hintergrundthread ausgeführt wird, bedeutet dies, dass der Funktions-Thread zu einem anderen Prozessor wechseln kann, der zu einem Fehler in den Messungen führt –

+0

Nach MSDN: "Hintergrundthreads sind identisch mit Vordergrundthreads, außer dass Hintergrundthreads nicht verhindern, dass ein Prozess beendet wird. " Ref: http: // msdn.microsoft.com/de-de/library/system.threading.thread.isbackground.aspx –

+0

@Tormod Fjeldskår, Vordergrund-/Hintergrund-Threads können auf andere Prozessoren umgestellt werden, daher ist mir der Typ egal, aber ich habe es in meinem Kommentar erwähnt Beispiel nicht mehr –

2

Ich denke, Sie fragen über die Low-Level-Implementierung von Stoppuhr und ob Switching-Prozessoren in der Mitte der Ausführung das Verhalten ungültig machen könnte. Die Umsetzung hat verwenden intern Queryperformancecounter (die MS BCL-Referenzquellen sehen, ich es in 4.0 mindestens .NET bestätigt haben.)

Die MS documentation für diese API lautet:

Auf einem Multi-Prozessor-Computer es, sollte egal sein, welcher Prozessor genannt wird. Sie können jedoch unterschiedliche Ergebnisse auf verschiedenen Prozessoren aufgrund von Fehlern in der grundlegenden Eingabe/Ausgabe-System (BIOS) oder der Hardware Abstraktionsschicht (HAL) erhalten.

Sie sind also richtig; Im Prinzip sollte das keine Rolle spielen, aber dieser Kommentar legt nahe, dass Fälle beobachtet wurden, in denen die Implementierung nicht der beabsichtigten Schnittstelle entspricht. Wenn Sie die Korrektheit der Messung garantieren möchten, können Sie, wie Sie angegeben haben, die Thread-Affinität verwenden. Das heißt, ich vermute, dass alle beobachteten Fehler ziemlich klein sind, da ein großer Unterschied ein ziemlich ernsthafter BIOS- oder HAL-Fehler sein würde.