2009-07-02 12 views
6

Ich schreibe ein Plug-in für ein anderes Programm in C# .NET und habe Leistungsprobleme, bei denen Befehle viel länger dauern als ich. Das Plug-in reagiert auf Ereignisse im Host-Programm und hängt auch von den Utility-Methoden des Host-Programm-SDK ab. Mein Plug-In hat viele rekursive Funktionen, weil ich viel in einer Baumstruktur lese und schreibe. Außerdem habe ich eine Menge von Ereignisabonnements zwischen meinem Plugin und der Host-Anwendung sowie Ereignisabonnements zwischen den Klassen in meinem Plug-in.Was ist der beste Weg, Performance-Probleme zu debuggen?

Wie kann ich herausfinden, was für eine Aufgabe so lange dauert? Ich kann das Debugging im regulären Breakpoint-Stil nicht verwenden, weil es nicht so funktioniert, dass es zu langsam ist. Ich habe eine statische "LogWriter" -Klasse eingerichtet, die ich aus allen meinen Klassen referenzieren kann, damit ich aus meinem Code mit Zeitstempel versehene Zeilen in eine Protokolldatei schreiben kann. Gibt es eine andere Art und Weise? Behält Visual Studio eine Art von Protokoll mit Zeitstempel bei, das ich stattdessen verwenden könnte? Gibt es eine Möglichkeit, die Aufrufliste nach dem Schließen der Anwendung anzuzeigen?

Antwort

15

Sie müssen Profiler verwenden. Hier Link zu einem guten: ANTS Performance Profiler.

Aktualisierung: Sie können auch Nachrichten in Kontrollpunkten mit Debug.Write schreiben. Dann müssen Sie DebugView Anwendung laden, die alle Ihre Debug-Zeichenfolge mit genauen Zeitstempel anzeigt. Es ist Freeware und sehr gut für schnelles Debugging und Profiling.

+0

Red Gate hat sicher gute Software machen. Ihr ANTS Performance Profiler ist meiner Meinung nach einer der besten. Ich glaube, dass Sie eine Testversion herunterladen können. Die meisten Leute, die später die echte Version kaufen, werden also gewarnt :). – bastijn

+1

Well Microsoft Profiler ist auch gut, aber es ist nur in teuren VS Pack enthält. – arbiter

+0

Daumen hoch für ANTS von mir auch beschlossen, einen großen Speicherverlust für mich –

1

Trotz des Titels dieses Themas muss ich argumentieren, dass der "beste" Weg subjektiv ist, wir können nur mögliche Lösungen vorschlagen.

Ich habe Erfahrung mit Redgate ANTS Performance Profiler, die Ihnen zeigt, wo die Engpässe in Ihrer Anwendung sind. Es ist definitiv einen Besuch wert.

4

My Profiler List enthält ANTS, dotTrace und AQtime.


jedoch genauer auf Ihre Frage suchen, scheint es mir, dass Sie zur gleichen Zeit einige Unit-Tests tun sollten Sie Profilierung zu tun sind. Beginnen Sie vielleicht mit einem schnellen Gesamtperformance-Scan, um festzustellen, welche Bereiche am meisten Aufmerksamkeit benötigen. Beginnen Sie dann, einige Komponententests für diese Bereiche zu schreiben. Sie können den Profiler dann ausführen, während Sie diese Komponententests ausführen, damit Sie konsistente Ergebnisse erhalten.

1

Visual Studio Team System hat einen Profiler eingebrannt, es ist alles andere als perfekt, aber für einfache Anwendungen können Sie es irgendwie zum Laufen bringen.

Kürzlich hatte ich den meisten Erfolg mit EQATECs freien Profiler, oder Rolling meine eigene kleine Profiling-Klasse, wo erforderlich.

Auch gibt es eine ganze Reihe von Fragen zu Profilometer in dieser Vergangenheit zu finden unter: http://www.google.com.au/search?hl=en&q=site:stackoverflow.com+.net+profiler&btnG=Google+Search&meta=&aq=f&oq=

+0

+1 für den Profiler, dass neu für mich. – arbiter

0

Sie können auch Leistungsindikatoren für asp.net Anwendungen verwenden.

2

Nach meiner Erfahrung ist die beste Methode, auch die einfachsten. Lassen Sie es laufen, und während es langsam ist, drücken Sie die "Pause" -Taste in der IDE. Dann notieren Sie sich den Call-Stack. Wiederholen Sie dies mehrmals. (Here's a more detailed example and explanation.)

Was Sie suchen, ist jede Aussage, die auf mehr als einer Stapelprobe erscheint, die nicht unbedingt notwendig ist. Je mehr Samples angezeigt werden, desto mehr Zeit wird benötigt. Um festzustellen, ob die Anweisung erforderlich ist, müssen Sie den Stapel nachschlagen, da Sie dadurch erfahren, warum er ausgeführt wird.

Alles, was eine erhebliche Menge an Zeit verursacht werden, verbraucht wird durch dieses Verfahren offenbart werden, und Rekursion es nicht stört.

scheinen Menschen Probleme wie diese in einer von zwei Möglichkeiten zu bewältigen:

  1. versuchen, bevor gute Messungen zu bekommen etwas zu tun.

  2. Nur etwas Großes feststellen, dass Sie loswerden kann, reißen Sie es aus, und wiederholen.

ziehe ich die letztere, weil es schnell ist, und weil Sie müssen genau wissen nicht, wie groß ein Tumor wissen, ist es groß genug ist, zu entfernen. Was Sie wissen müssen, ist genau, wo es ist, und das ist es, was Ihnen diese Methode sagt.

Verwandte Themen