Exemplarische Vorgehensweise: Profilerstellung für Anwendungen
In dieser exemplarischen Vorgehensweise wird veranschaulicht, wie ein Profil einer Anwendung erstellt wird, um Leistungsprobleme zu erkennen.
In dieser exemplarischen Vorgehensweise werden Sie Schritt für Schritt durch den Vorgang der Profilerstellung einer verwalteten Anwendung geleitet, wobei mithilfe von Sampling und Instrumentation Leistungsprobleme in der Anwendung isoliert und identifiziert werden.
Im Verlauf dieser exemplarischen Vorgehensweise führen Sie die folgenden Schritte aus:
Profilerstellung einer Anwendung mithilfe der Samplingmethode
Analysieren der Ergebnisse der Profilerstellung, für die ein Sampling durchgeführt wurde, um ein Leistungsproblem zu lokalisieren und zu beheben
Profilerstellung einer Anwendung mithilfe der Instrumentationsmethode
Analysieren der Ergebnisse der Profilerstellung, für die eine Instrumentation durchgeführt wurde, um ein Leistungsproblem zu lokalisieren und zu beheben
Vorbereitungsmaßnahmen
Microsoft Visual Studio 2010.
Grundlegende Kenntnisse über C#.
Eine Kopie von PeopleTrax-Beispiel (Profilerstellungstools).
Um mit den durch die Profilerstellung bereitgestellten Informationen arbeiten zu können, sollten Symbolinformationen für das Debuggen verfügbar sein.
Profilerstellung mithilfe der Samplingmethode
Das Sampling ist eine Methode der Profilerstellung, bei der der betreffende Prozess periodisch zum Bestimmen der aktiven Funktion überprüft wird. Die resultierenden Daten enthalten Angaben dazu, wie häufig die betreffende Funktion sich während des Samplings des Prozesses in der Aufrufliste ganz oben befunden hat.
So führen Sie eine Profilerstellung einer Anwendung mithilfe der Samplingmethode aus
Öffnen Sie Visual Studio mit Administratorrechten. Die Ausführung als Administrator ist für die Profilerstellung erforderlich.
Öffnen Sie die Projektmappe "PeopleTrax".
Die Projektmappe PeopleTrax wird jetzt im Projektmappen-Explorer angezeigt.
Legen Sie die Einstellung für die Projektkonfiguration auf Release fest.
Verwenden Sie zum Ermitteln von Leistungsproblemen in der Anwendung nach Möglichkeit einen Releasebuild. Für die Profilerstellung wird ein Releasebuild empfohlen, da bei einem Debugbuild zusätzliche Informationen in den Build kompiliert werden, die die Leistung beeinträchtigen können. Leistungsprobleme werden daher möglicherweise nicht korrekt vermittelt.
Klicken Sie im Menü Analyse auf Leistungs-Assistenten starten.
Der Leistungs-Assistent wird angezeigt.
Vergewissern Sie sich, dass CPU-Sampling (empfohlen) ausgewählt ist, und klicken Sie anschließend auf Weiter.
Wählen Sie unter Welche Anwendung soll für die Profilerstellung als Ziel festgelegt werden die Option "PeopleTrax" aus, und klicken Sie auf Weiter.
Das Projekt wird von Visual Studio erstellt, und die Profilerstellung für die Anwendung wird gestartet. Das Anwendungsfenster für PeopleTrax wird angezeigt.
Klicken Sie auf Personen abrufen.
Klicken Sie auf Daten exportieren.
In Editor wird eine neue Datei angezeigt, die die exportierten Daten aus PeopleTrax enthält.
Schließen Sie Editor, und dann schließen Sie dann die Anwendung PeopleTrax.
Der Profiler generiert eine Profilerstellungs-Datendatei (VSP-Datei), führt den Dateinamen im Abschnitt "Berichte" des Fensters "Leistungs-Explorer" auf und lädt im Hauptfenster von Visual Studio automatisch die Ansicht Zusammenfassung für die Datendatei.
So analysieren Sie die Ergebnisse der Profilerstellung, für die ein Sampling durchgeführt wurde
Die Ansicht "Zusammenfassung" enthält eine Zeitachse mit der CPU-Auslastung für den Zeitraum der Profilerstellung, die Liste Langsamster Pfad, die die aktivste Verzweigung der Aufrufstruktur der Anwendung darstellt, sowie die Liste Funktionen, die die meisten Einzelaufgaben durchführen mit den Funktionen, die beim Ausführen des Codes im eigenen Funktionstext am stärksten gesampelt wurden.
Überprüfen Sie die Liste Langsamster Pfad, und beachten Sie, dass es sich bei der PeopleNS.People.GetNames-Methode um die PeopleTrax-Funktion handelt, die dem Ende der Liste am nächsten ist. Aufgrund dieser Position eignet sich das Element besonders gut für eine Analyse. Klicken Sie auf den Funktionsnamen, um in der Ansicht Funktionsdetails Details zu "GetNames" anzuzeigen.
Die Ansicht Funktionsdetails enthält zwei Fenster. Das Fenster "Kostenverteilung" enthält eine grafische Darstellung der ausgeführten Aufgaben der Funktion, eine Darstellung der Aufgaben, die von den aufgerufenen Funktionen ausgeführt wurden, sowie eine Darstellung des Beitrags von Funktionen, von denen die Funktion aufgerufen wurde, zur Anzahl der gesampelten Instanzen. Durch Klicken auf einen Funktionsnamen können Sie die Funktion ändern, die sich im Fokus der Ansicht befindet. So können Sie beispielsweise auf "PeopleNS.People.GetPeople" klicken, um die Funktion "GetPeople" auszuwählen.
Das Fenster Funktionscodeansicht enthält den Quellcode für die Funktion (sofern verfügbar). Darüber hinaus werden die speicherintensivsten Zeilen in der ausgewählten Funktion hervorgehoben. Ist "GetNames" ausgewählt, ist zu sehen, dass von dieser Funktion eine Zeichenfolge aus den Anwendungsressourcen gelesen wird und die einzelnen Zeilen in der Zeichenfolge anschließend mithilfe von StringReader einer ArrayList hinzugefügt werden. Diese Funktion kann offenbar nicht optimiert werden.
Da es sich bei "PeopleNS.People.GetPeople" um den einzigen Aufrufer von "GetNames" handelt, klicken Sie im Fenster "Kostenverteilung" auf "GetPeople", um den Code zu untersuchen. Von dieser Methode wird eine ArrayList mit PersonInformationNS.PersonInformation-Objekten aus den Namen der Personen und Unternehmen zurückgegeben, die von "GetNames" erstellt wurden. "GetNames" wird jedoch bei jeder Erstellung des PersonInformation-Objekts zweimal aufgerufen. Wie Sie sehen, lässt sich die Methode auf einfache Weise optimieren, indem die Listen lediglich einmal beim Start der Methode erstellt und während der PersonInformation-Erstellungsschleife indiziert werden.
Im Code der Beispielanwendung ist eine alternative Version von "GetPeople" enthalten. Fügen Sie den Buildeigenschaften ein Symbol für die bedingte Kompilierung hinzu, um die optimierte Funktion aufzurufen. Klicken Sie im Fenster Projektmappen-Explorer mit der rechten Maustaste auf das Projekt People, und klicken Sie anschließend auf Eigenschaften. Klicken Sie im Menü der Eigenschaftenseite auf Erstellen, und geben Sie anschließend im Textfeld "Symbole für bedingte Kompilierung" den Text OPTIMIZED_GETPEOPLE ein. Im nächsten Build wird die ursprüngliche Methode durch die optimierte Version von "GetPeople" ersetzt.
Führen Sie die Leistungssitzung erneut aus. Klicken Sie auf der Symbolleiste des Leistungs-Explorers auf Mit Profilerstellung starten. Klicken Sie auf Personen abrufen und anschließend auf Daten exportieren. Schließen Sie das angezeigte Editor-Fenster und anschließend die Anwendung "PeopleTrax".
Eine neue Profilerstellungs-Datendatei wird generiert, und im Hauptfenster von Visual Studio wird eine Zusammenfassung für die neuen Daten angezeigt.
Wählen Sie zum Vergleichen der beiden Profilerstellungen im Leistungs-Explorer die beiden Datendateien aus, klicken Sie mit der rechten Maustaste auf die Dateien, und klicken Sie anschließend auf Leistungsberichte vergleichen. Im Hauptfenster von Visual Studio wird ein Fenster mit einem Vergleichsbericht angezeigt. Die Spalte Delta enthält die Änderung des Leistungswerts der Funktionen vom früheren Baselinewert zum späteren Vergleichswert. Die zu vergleichenden Werte können in der Dropdownliste Spalte ausgewählt werden. Wählen Sie Inklusive Samplings in % aus.
Beachten Sie, dass bei der GetPeople-Methode und der GetNames-Methode eine beträchtliche Leistungssteigerung zu verzeichnen ist.
Profilerstellung mithilfe der Instrumentationsmethode
Bei der Instrumentation handelt es sich um eine Profilerstellungsmethode, bei der vom Profiler Testfunktionen in speziell erstellte Versionen der Binärdateien eingefügt werden, für die das Profil erstellt wird. Von den Testfunktionen werden am Start und am Ende von Funktionen in den instrumentierten Modulen sowie an allen Aufrufsites in diesen Funktionen Zeitsteuerungsinformationen gesammelt. Der Instrumentationsprozess ist hilfreich beim Untersuchen von Problemen mit Eingabe-/Ausgabeoperationen wie dem Schreiben auf einen Datenträger oder der Kommunikation in einem Netzwerk. Bei der Instrumentation erhalten Sie zwar ausführlichere Informationen als beim Sampling, dafür wird jedoch stärker in die Prozessausführung eingegriffen, und auch der Mehraufwand fällt höher aus. Instrumentierte Binärdateien sind zudem größer als Binärdateien für eine Debug- oder Releaseversion und nicht für die Bereitstellung vorgesehen.
In diesem Abschnitt der exemplarischen Vorgehensweise wird in der Anwendung "PeopleTrax", für die bereits zuvor eine Profilerstellung ausgeführt wurde, mithilfe der Instrumentationsmethode weiterer optimierbarer Code gesucht. Mithilfe des Filters der Zeitachse in der Zusammenfassungsansicht wird die Analyse auf das Exportdatenszenario der Anwendung konzentriert, für die ein Profil erstellt wurde und in der eine Liste mit Personen in eine Editor-Datei geschrieben wird.
So führen Sie eine Profilerstellung einer vorhandenen Anwendung mithilfe der Instrumentationsmethode durch
Öffnen Sie ggf. die Anwendung "PeopleTrax" in Visual Studio.
Vergewissern Sie sich, dass Sie als Administrator angemeldet sind und die Buildkonfiguration für die Projektmappe auf Release festgelegt ist.
Klicken Sie im Leistungs-Explorer auf Instrumentation.
Klicken Sie auf der Symbolleiste des Leistungs-Explorers auf Mit Profilerstellung starten.
Das Projekt wird erstellt, und die Profilerstellung der Anwendung wird gestartet. Das Anwendungsfenster für "PeopleTrax" wird angezeigt.
Klicken Sie auf Personen abrufen.
Im Datenblatt PeopleTrax werden Daten angezeigt.
Warten Sie etwa 10 Sekunden, und klicken Sie anschließend auf Daten exportieren.
In Editor wird eine neue Datei angezeigt, die eine Liste der Personen aus PeopleTrax enthält. Durch das Warten lässt sich die Datenexportprozedur für die Filterung leichter identifizieren.
Schließen Sie Editor, und schließen Sie dann die Anwendung PeopleTrax.
Visual Studio generiert einen Bericht über die Leistungssitzung (* .vsp).
So analysieren Sie die Ergebnisse der instrumentierten Profilerstellung
Das Zeitachsendiagramm der Ansicht Zusammenfassung des Berichts enthält die CPU-Auslastung des Programms während der Profilerstellung. Bei dem Exportvorgang der Daten muss es sich um die große Spitze oder den Ausschlag rechts im Diagramm handeln. Die Leistungssitzung kann gefiltert werden, um nur die Daten anzuzeigen und zu analysieren, die im Rahmen des Exportvorgangs erfasst wurden. Klicken Sie im Diagramm auf eine Position links des Punkts, an dem der Exportvorgang der Daten beginnt. Klicken Sie auf eine Position rechts des Vorgangs. Klicken Sie anschließend rechts neben der Zeitachse in der Liste mit den Links auf Nach Auswahl filtern.
In der Struktur Langsamster Pfad wird ersichtlich, dass die Concat-Methode, die von der PeopleTrax.Form1.ExportData-Methode aufgerufen wird, sehr zeitaufwändig ist. Da sich System.String.Concat auch am Anfang der Liste Funktionen mit den meisten einzelnen Aufgaben befindet, stellt eine Verringerung der für die Funktion aufgewendeten Zeit mit großer Wahrscheinlichkeit eine Optimierung dar.
Doppelklicken Sie in einer der Zusammenfassungstabellen auf System.String.Concat, um in der Ansicht "Funktionsdetails" weitere Informationen anzuzeigen.
Wie Sie sehen, ist "PeopleTrax.Form1.ExportData" die einzige Methode, von der "Concat" aufgerufen wird. Klicken Sie in der Liste Aufrufende Funktionen auf PeopleTrax.Form1.ExportData, um die Methode als Ziel der Ansicht "Funktionsdetails" auszuwählen.
Untersuchen Sie die Methode im Fenster "Funktionscodeansicht". Beachten Sie, dass es keine literalen Aufrufe von System.String.Concat vorhanden sind. Stattdessen wird mehrmals der Operand "+=" verwendet, der durch Aufrufe von System.String.Concat ersetzt wird. Änderungen an einer Zeichenfolge in .NET Framework führen dazu, dass eine neue Zeichenfolge zuordnet wird. .NET Framework enthält eine StringBuilder-Klasse, die für die Zeichenfolgenverkettung optimiert ist.
Um diesen Problembereich durch optimierten Code zu ersetzen, fügen Sie dem Projekt PeopleTrax OPTIMIZED_EXPORTDATA als Symbol für die bedingte Kompilierung hinzu.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt PeopleTrax, und klicken Sie dann auf Eigenschaften.
Das Eigenschaftenformular des Projekts PeopleTrax wird angezeigt.
Klicken Sie auf die Registerkarte Erstellen.
Geben Sie im Textfeld Symbole für bedingte Kompilierung den Text "OPTIMIZED_EXPORTDATA" ein.
Schließen Sie das Eigenschaftenformular des Projekts, und wählen Sie Alle speichern, wenn Sie dazu aufgefordert werden.
Wenn Sie die Anwendung erneut ausführen, stellen Sie bei der Leistung merkliche Verbesserungen fest. Es wird empfohlen, die Profilerstellungssitzung auch dann erneut auszuführen, wenn sich in der Leistung für den Benutzer erkennbare Verbesserungen eingestellt haben. Die erneute Überprüfung der Daten nach Behebung eines Problems ist überaus wichtig, da unter Umständen noch andere Probleme vorhanden sind, die aufgrund des ersten Problems nicht ersichtlich waren.
Siehe auch
Referenz
/Z7, /Zi, /ZI (Debuginformationsformat)
Konzepte
Erste Schritte mit Profilerstellungstools