13 Stimmen

Testen Sie Ihren Code auf Geschwindigkeit?

Ich bin totaler Neuling, aber ich habe ein kleines Programm geschrieben, das auf Zeichenketten in C# arbeitet, und mir ist aufgefallen, dass wenn ich ein paar Dinge anders gemacht habe, der Code signifikant schneller ausgeführt wurde.

Also habe ich mich gefragt, wie man die Ausführungsgeschwindigkeit des Codes stoppt. Gibt es (kostenlose) Tools dafür? Geht man den altmodischen Weg und benutzt man ein System.Timer und macht es selbst?

18voto

Xian Punkte 74901

Was du beschreibst, wird als Leistungsprofilierung bezeichnet. Es gibt viele Programme, die das können, wie z.B. Jetbrains Profiler oder Ants Profiler, obwohl die meisten Ihre Anwendung verlangsamen, während sie die Leistung messen.

Um Ihre eigene Leistungsprofilierung zu erstellen, können Sie System.Diagnostics.Stopwatch verwenden und ein einfaches Console.WriteLine, wie du beschrieben hast.

Denken Sie auch daran, dass der C# JIT-Compiler den Code je nach Typ und Häufigkeit, mit der er aufgerufen wird, optimiert, also spielen Sie mit Schleifen von unterschiedlichen Größen und Methoden wie rekursive Aufrufe, um ein Gefühl dafür zu bekommen, was am besten funktioniert.

11voto

Eric Schoonover Punkte 45504

ANTS Profiler von RedGate ist ein wirklich schöner Leistungsprofilierer. dotTrace Profiler von JetBrains ist auch großartig. Diese Tools ermöglichen es Ihnen, Leistungsmetriken zu sehen, die bis zu jeder einzelnen Zeile verfeinert werden können.

Screenshot von ANTS Profiler: ANTS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

Wenn Sie sicherstellen möchten, dass eine bestimmte Methode während des Unit-Tests innerhalb eines bestimmten Leistungsrahmens bleibt, würde ich die Stopwatch-Klasse verwenden, um die Ausführungszeit einer Methode einmal oder mehrmals in einer Schleife zu überwachen und den Durchschnitt zu berechnen und dann Assert gegen das Ergebnis zu setzen.

8voto

ripper234 Punkte 211096

Nur eine Erinnerung - stellen Sie sicher, dass Sie im Release und nicht im Debug kompilieren! (Ich habe diesen Fehler schon bei erfahrenen Entwicklern gesehen - es ist leicht zu vergessen).

3voto

Rejeev Divakaran Punkte 4257

Was Sie beschreiben, ist 'Performance-Tuning'. Wenn wir über Performance-Tuning sprechen, gibt es zwei Aspekte daran. (a) Reaktionszeit - wie lange es dauert, eine bestimmte Anfrage/ein bestimmtes Programm auszuführen. (b) Durchsatz - Wie viele Anfragen es pro Sekunde ausführen kann. Wenn wir normalerweise 'optimieren' - wenn wir unnötige Verarbeitung eliminieren, verbessern sich sowohl die Reaktionszeit als auch der Durchsatz. Wenn jedoch Warteereignisse in Ihrem Code vorhanden sind (wie Thread.sleep(), I/O-Wartezeit usw.), wird Ihre Reaktionszeit beeinflusst, jedoch nicht der Durchsatz. Durch die Annahme von paralleler Verarbeitung (Erzeugen mehrerer Threads) können wir die Reaktionszeit verbessern, aber der Durchsatz wird nicht verbessert. Typischerweise sind sowohl die Reaktionszeit als auch der Durchsatz für serverseitige Anwendungen wichtig. Für Desktop-Anwendungen (wie eine IDE) ist der Durchsatz nicht wichtig, nur die Reaktionszeit ist wichtig.

Sie können die Reaktionszeit durch 'Performance-Tests' messen - Sie notieren einfach die Reaktionszeit für alle wichtigen Transaktionen. Sie können den Durchsatz durch 'Lasttests' messen - Sie müssen kontinuierlich Anfragen von ausreichend vielen Threads/Kunden pumpen, so dass die CPU-Auslastung des Servers bei 80-90% liegt. Wenn wir Anfragen pumpen, müssen wir das Verhältnis zwischen verschiedenen Transaktionen aufrechterhalten (genannt Transaktionsmix) - zum Beispiel: in einem Reservierungssystem gibt es 10 Buchungen für jede 100 Suche. Es gibt eine Stornierung für jede 10 Buchungen usw.

Nach Identifizierung der Transaktionen, die für die Reaktionszeitabstimmung (Leistungstests) erforderlich sind, können Sie die Hot Spots mithilfe eines Profilers identifizieren. Sie können die Hot Spots für den Durchsatz identifizieren, indem Sie die Reaktionszeit * Bruchteil dieser Transaktion vergleichen. Wenn wir uns etwa das Szenario Suche, Buchung, Stornierung ansehen, beträgt das Verhältnis 89:10:1. Die Reaktionszeiten betragen 0,1 Sekunden, 10 Sekunden und 15 Sekunden. Last für Suche - 0,1 * 0,89 = 0,089 Last für Buchung- 10 * 0,1 = 1 Last für Storno= 15 * 0,01= 0,15 Hier wird die Abstimmung der Buchung den größten Einfluss auf den Durchsatz haben. Sie können auch Hot Spots für den Durchsatz identifizieren, indem Sie Thread-Dumps (bei java-basierten Anwendungen) wiederholt durchführen.

1voto

Lars A. Brekken Punkte 22085

Verwenden Sie einen Profiler.

Wenn Sie nur eine bestimmte Methode zeitlich erfassen müssen, könnte die Stopwatch-Klasse eine gute Wahl sein.

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