493 Stimmen

Ist DateTime.Now der beste Weg, um die Leistung einer Funktion zu messen?

Ich muss einen Engpass finden und die Zeit so genau wie möglich messen.

Ist der folgende Code-Schnipsel der beste Weg, um die Leistung zu messen?

DateTime startTime = DateTime.Now;

// Einige Ausführungsprozesse

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);

0 Stimmen

Übrigens, wenn Sie nicht auf der Suche nach etwas Schnellem und Dreckigem sind, können Leistungsindikatoren verwendet werden.

1 Stimmen

Wenn Sie eine größere Genauigkeit benötigen, verwenden Sie Stopwatch.GetTimestamp, ansonsten ist die Antwort gut.

0 Stimmen

@dbasnett Können Sie in einer Antwort mehr ins Detail gehen?

6voto

Iain Punkte 9943

Visual Studio Team System hat einige Funktionen, die bei diesem Problem helfen können. Im Wesentlichen können Sie Unit-Tests schreiben und sie in verschiedenen Szenarien mischen, um sie als Teil eines Stress- oder Lasttests gegen Ihre Software auszuführen. Dies kann helfen, Bereiche des Codes zu identifizieren, die sich am stärksten auf die Leistung Ihrer Anwendungen auswirken.

Die Microsoft 'Patterns and Practices' Gruppe bietet einige Anleitungen in Visual Studio Team System Performance Testing Guidance.

5voto

OwenP Punkte 24128

Ich habe gerade einen Beitrag im Blog von Vance Morrison über eine CodeTimer-Klasse gefunden, die er geschrieben hat, um die Verwendung von StopWatch zu erleichtern und einige coole Dinge nebenbei zu erledigen.

5voto

Blackvault Punkte 199

Die Methode, die ich innerhalb meiner Programme verwende, ist die Verwendung der StopWatch-Klasse, wie hier gezeigt.

Stopwatch sw = new Stopwatch();
sw.Start();

// Kritische Codezeilen

long elapsedMs = sw.Elapsed.TotalMilliseconds;

4voto

Rob Cooper Punkte 28132

Ich habe bisher sehr wenig von dieser Art von Leistungsüberprüfung gemacht (ich neige dazu, einfach zu denken "das ist langsam, mach es schneller"), daher habe ich praktisch immer das gemacht.

Ein Google-Suche zeigt viele Ressourcen/Artikel zur Leistungsüberprüfung.

Viele erwähnen die Verwendung von Pinvoke, um Leistungsinformationen zu erhalten. Viele der Materialien, die ich studiere, erwähnen nur die Verwendung von Perfmon...

Bearbeiten:

Habe die Vorträge über StopWatch gesehen.. Schön! Ich habe etwas gelernt :)

Dies sieht aus wie ein guter Artikel

4voto

Bye StackOverflow Punkte 235

Dies reicht nicht professionell aus:

Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();

Console.WriteLine("Dauer: {0}ms", sw.Elapsed.TotalMilliseconds);

Eine zuverlässigere Version ist:

PerformWork();

int repeat = 1000;

Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < repeat; i++)
{
   PerformWork();
}

sw.Stop();

Console.WriteLine("Dauer: {0}ms", sw.Elapsed.TotalMilliseconds / repeat);

In meinem richtigen Code werde ich einen Aufruf zu GC.Collect hinzufügen, um den verwalteten Heap in einen bekannten Zustand zu versetzen, und einen Aufruf zu Sleep hinzufügen, damit verschiedene Intervalles des Codes leicht im ETW-Profil getrennt werden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X