.Net: Performanceprofiler gesucht

Rossibaer

Lieutenant
Registriert
Apr. 2007
Beiträge
754
Hallo zusammen,

nach langer Abstinenz wollte ich mich mal mit einer Frage melden...

Folgendes Problem habe ich:
Ich habe eine .Net Applikation (Windows Forms) erstellt. Diese kann zur Laufzeit dynamisch ein, sagen wir mal, "Plugin" für das Modul laden. Dies wird mittels Reflection erledigt. Nun ist es so, dass die App (für meine Begriffe recht komplex) ohne Plugin ca. 4-7 Sekunden braucht um zu starten. Mit dem Plugin schießt das Ganze dann auf 20-30 Sekunden hoch. Das Laden des Plugins bremst die App dermaßen aus, dass ich nun an dem Code der Plugin App ansetzen werde um hier die Performance wieder auf ein erträgliches Mass zu steigern.

Nun habe ich jedoch keinen genauen Überblick, wo genau die Flaschenhälse sind und will mir mit einem Performanceprofiler einen Überblick verschaffen. Nun gibt es ja verschiedene mehr oder weniger gute Profiler. Ich bin auf der Suche nach einem möglichst kostenlosen Programm. Bisher habe ich den InsightProfiler und Redgates ANTS ausprobiert. Weitere Performanceprofiler habe ich mal kurz angetestet, konnte aber nicht wirklich brauchbare Ergebnisse erzielen, wodurch ich dann auch recht schnell deren Namen vergessen habe. Den Profiler würde ich gerne nicht nur mal zum Testen verwenden, sondern mehr in meine tägliche Arbeit einbeziehen.

ANTS ist schon aus meiner Liste gefallen, kostet recht viel, für mich zu teuer. Der InsightProfiler ist in der kostenlosen Version stark eingeschränkt (nur 4 oder 5 Threads können untersucht werden). Die Analyse war auf den eigenen Code eingeschränkt, der Plugin Code (obwohl eigener Code) konnte nicht untersucht werden. Die Ausgabe war für die Methoden insgesamt und nicht wie bei ANTS zeilenbasiert. Kurzum bin ich auf der Suche nach einem Profiler der folgendes bietet:
- Analyse aller Threads einer App
- Analyse von eigenem und "fremden" Code
- Analyse möglichst zeilenbasiert
- per Reflection geladene Assemblies sollten ebenfalls analysiert werden können

Kennt ihr weitere Performanceprofiler, die es lohnen mal einen Blick darauf zu werfen?
Ach nochwas, zum Entwickeln der Applikation habe ich nur Zugriff auf Visual Studio 2010 Pro. Evtl. gibts da schon etwas, aber leider habe ich im Internet Tipps nur für "höhere" Editionen des Visual Studios gefunden.

Vielen Dank schonmal für das Lesen des Threads, wenn ihr noch einen Tipp habt, dann wäre ich euch sehr dankbar.

Gruß Rossibaer

PS: Wenn es hart auf hart kommt, werde ich wohl das ganze "von Hand" sprich mit eigenem Debug-Code ala StopWatch machen müssen, schön wäre aber ein brauchbares Tool, dass mir diese Vorgehensweise erspart.
 
Danke Oiisamiio, den Profiler hatte ich auch schon mal in der Vergangenheit, vor mehreren Monaten, ausprobiert ... War leider nicht so mein Ding, kam irgendwie nicht mit klar. Ich werde aber trotzdem nochmal den Profiler auf meine Applikation loslassen. Mal sehen. Danke dir!
 
Hi oiisamiio,

danke noch mal für deinen Tipp, jedoch ist es so, dass die zuletzt genannten Tools nur für C#, C++ und Java sind. Die App von mir ist jedoch in VB.Net geschrieben. Werde also wahrscheinlich nicht viel damit anfangen können. Zuguter letzt konnte ich dennoch Erfolge erzielen:

1. Habe wieder diverse Profiler (Ants, DotTrace und InsightProfiler) bemüht, aber keiner konnte mir die tatsächlichen Flaschenhälse zeigen!
2. Habe nun mit StopWatch diverse Code-Bereiche, wo ich dachte, dass die das Problem verursachen, gemessen.

Ergebnisse meiner Messungen:
Ich hatte an einer Stelle einen StackTrace verwendet, der von 1000 Aufrufen ausgerechnet bei 2 Aufrufen während des Starts eine Verzögerung von 8 sec bewirkte! Das hatte mir kein Profiler zeigen können! Glücklicherweise kann ich auf den StackTrace verzichten und somit 8sec gewinnen.

Desweiteren benötigte das Jitten des Plugincodes (eine Methode mit ca 12.000 Zeilen Code!) 8sec, die Ausführung dann 3sec. Wieder zeigte mir kein Profiler dieses Problem! Die Methode wird dynamisch vom Programm erzeugt und ist analog zur InitializeComponents Methode einer Windows Form zu sehen. Das Programm hostet einen WinForms Designer. Ich habe schlicht die CodeDom Serialisierung des Designers dahingehend geändert, dass ich für die Controls dann jeweils eine eigene Init Methode erzeuge und in der Hauptmethode nur noch diese neue Methode aufrufe. Die 12.000 Zeilen reduzierten sich dadurch auf gerade mal 1000 Zeilen. Schwupp die Wupp waren wieder 8 sec gewonnen.

Dann hatte ich das Jitten der Plugin Methoden in einen neuen Thread während der Login Phase verschoben, was mir nochmals 3 sec Zeit sparte (http://www.codeproject.com/Articles/34148/JIT-methods-at-runtime)

Der Init Code der Controls erhielt von mir noch zusätzlich diese BeginInit und SuppressLayout Aufrufe wodurch wieder im Sekundenbereich Zeit gespart werden konnte.

Zuletzt konnte ich dann noch ein wenig die notwendigen Zugriffe auf eine Datenbank reduzieren, wodurch ich nochmal einige Sekunden sparen konnte. Am Ende habe ich nun mein Modul bei einer Startzeit von ca 3 sec, was für mich nun vollkommen ausreicht. Danke dir, dass du als einziger mir ein paar Tipps gegeben hattest und ich wünsch dir alles Gute...

Viele Grüße
Rossibaer
 
Zuletzt bearbeitet:
Zurück
Oben