6 Stimmen

Leistungsmetriken für bestimmte Routinen: Gibt es bewährte Verfahren?

Ich würde gerne Metriken zu bestimmten Routinen meines Codes sammeln, um zu sehen, wo ich am besten optimieren kann. Nehmen wir ein einfaches Beispiel und sagen wir, ich habe eine "Klassen"-Datenbank mit mehreren "Schülern". Angenommen, der aktuelle Code ruft die Datenbank für jeden Schüler auf, anstatt sie alle auf einmal in einem Batch zu erfassen. Ich würde gerne sehen, wie lange jeder Aufruf der Datenbank für jede Schülerzeile dauert.

Dies ist in C#, aber ich denke, es gilt überall. Normalerweise, wenn ich neugierig auf die Leistung einer bestimmten Routine werde, erstelle ich ein DateTime-Objekt, bevor es läuft, führe die Routine aus und erstelle dann ein weiteres DateTime-Objekt nach dem Aufruf und nehme die Millisekunden Differenz zwischen den beiden, um zu sehen, wie lange es läuft. Normalerweise gebe ich dies nur im Trace der Seite aus... es ist also ein bisschen unschön. Gibt es dafür irgendwelche Best Practices? Ich dachte über in der Lage, die Web-App in einige "Diagnose"-Modus zu setzen und tun ausführliche Protokollierung/Ereignisprotokoll schreiben mit was auch immer ich bin nach, aber ich wollte sehen, wenn die Stackoverflow Hive Mind eine bessere Idee hat.

3voto

S.Lott Punkte 371691

Bei Datenbankabfragen gibt es zwei kleine Probleme. Cache: Daten-Cache und Anweisungs-Cache.

Wenn Sie die Abfrage einmal ausführen, wird die Anweisung geparst, vorbereitet, gebunden und ausgeführt. Die Daten werden aus den Dateien in den Cache geholt.

Wenn Sie die Abfrage ein zweites Mal ausführen, wird der Cache verwendet, und die Leistung ist oft viel, viel besser.

Welches ist die "echte" Leistungszahl? Die erste oder die zweite? Einige Leute sagen, dass der "schlimmste Fall" die wahre Zahl ist und wir diesen optimieren müssen. Andere sagen "typischer Fall" und führen die Abfrage zweimal aus, wobei sie die erste ignorieren. Andere sagen "Durchschnitt" und führen die Abfrage 30 Mal aus, wobei sie den Durchschnitt aller Abfragen bilden. Andere sagen "typischer Durchschnitt", lassen die Abfrage 31 Mal laufen und bilden den Durchschnitt der letzten 30.

Ich schlage vor, dass die "letzten 30 von 31" die aussagekräftigste DB-Leistungszahl sind. Kümmern Sie sich nicht um die Dinge, die Sie nicht kontrollieren können (Parse-, Prepare-, Bindungszeiten). Kümmern Sie sich um die Dinge, die Sie kontrollieren können - Datenstrukturen, E/A-Laden, Indizes usw.

2voto

Elie Punkte 13413

Ich verwende diese Methode gelegentlich und finde sie ziemlich genau. Das Problem ist, dass es bei großen Anwendungen mit einer ziemlich großen Menge an Debugging-Protokollen mühsam sein kann, die Protokolle nach diesen Informationen zu durchsuchen. Daher verwende ich externe Tools (ich programmiere hauptsächlich in Java und verwende JProbe), die es mir ermöglichen, die Durchschnitts- und Gesamtzeiten für meine Methoden zu sehen, wie viel Zeit ausschließlich von einer bestimmten Methode verbraucht wird (im Gegensatz zur kumulativen Zeit, die von der Methode und allen von ihr aufgerufenen Methoden verbraucht wird), sowie die Speicher- und Ressourcenzuweisungen.

Diese Tools können Ihnen dabei helfen, die Leistung ganzer Anwendungen zu messen. Wenn Sie in einem Bereich, in dem die Leistung wichtig ist, viel entwickeln, sollten Sie sich über die verfügbaren Tools informieren und lernen, wie man sie benutzt.

1voto

Glenn Punkte 7588

Es gibt einige Profiler verfügbar, aber ehrlich gesagt halte ich Ihren Ansatz für besser. Der Profiler-Ansatz ist übertrieben. Vielleicht ist der Einsatz von Profilern die Mühe wert, wenn man absolut keine Ahnung hat, wo der Engpass liegt. Ich würde lieber ein wenig Zeit damit verbringen, das Problem im Vorfeld zu analysieren und ein paar strategische Druckanweisungen zu formulieren, als herauszufinden, wie man die Anwendung für die Profilerstellung instrumentiert, um dann riesige Berichte zu verfassen, in denen jede ausführbare Codezeile zeitlich erfasst wird.

1voto

Gabriel Isenberg Punkte 24989

Wenn Sie mit .NET arbeiten, dann empfehle ich Ihnen, sich die Stoppuhr Klasse. Die Zeiten, die Sie auf diese Weise erhalten, sind viel genauer als eine entsprechende Stichprobe mit DateTime.

Ich empfehle auch einen Blick auf ANTS-Profiler für Szenarien, in denen die Leistung besonders wichtig ist.

1voto

Bill Michell Punkte 8050

Es lohnt sich, in einen guten handelsüblichen Profiler zu investieren, vor allem, wenn Sie damit rechnen, dies ein zweites Mal tun zu müssen.

Die, die ich benutze, JProfiler funktioniert in der Java-Welt und kann an eine bereits laufende Anwendung angehängt werden, so dass keine spezielle Instrumentierung erforderlich ist (zumindest bei den neueren JVMs).

Es erstellt sehr schnell eine sortierte Liste von Hotspots in Ihrem Code, die zeigt, in welchen Methoden Ihr Code die meiste Zeit verbringt. Es filtert standardmäßig ziemlich intelligent und erlaubt Ihnen, die Filterung bei Bedarf weiter zu optimieren, was bedeutet, dass Sie die Details von Bibliotheken von Drittanbietern ignorieren können, während Sie diejenigen Ihrer Methoden heraussuchen, die die ganze Zeit benötigen.

Darüber hinaus erhalten Sie viele weitere nützliche Berichte über die Vorgänge in Ihrem Code. Die Kosten für die Lizenz haben sich durch die Zeitersparnis bei der ersten Verwendung bezahlt gemacht. Ich musste nicht viele Protokollierungsanweisungen einfügen und einen Mechanismus zur Auswertung der Ausgabe konstruieren: Die Entwickler des Profilers hatten all das bereits für mich getan.

Ich bin mit ej-technologies in keiner Weise verbunden, außer dass ich ein sehr zufriedener Kunde bin.

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