Dieser Artikel wurde maschinell übersetzt.

Leistung von Threads

Parallelitätsprofilerstellung für Ressourcenkonflikte in Visual Studio 2010

Maxim Goldin

Mehrkernprozessoren je mehr alltäglich sind, sind Softwareentwickler Multithread-Anwendungen erstellen, die nutzen der zusätzlichen Verarbeitungskapazität, eine bessere Leistung zu erreichen.Die Leistungsfähigkeit von parallelen Threads können Sie die gesamte Arbeit in einzelne Aufgaben teilen und die Vorgänge parallel ausgeführt.

Threads, müssen jedoch häufig kommunizieren miteinander, um eine Aufgabe durchführen und in einigen Fällen müssen deren Verhalten synchronisieren, wenn eine Algorithmus oder Daten-Zugriff erforderlich ist.Beispielsweise sollten gleichzeitiger Schreibzugriff auf die gleichen Daten an Threads sich gegenseitig ausschließende zu Beschädigungen von Daten zu vermeiden erteilt werden.

Synchronisierung wird häufig durch die Verwendung von freigegebenen Synchronisierungsobjekte, erreicht, in dem der Thread das Objekt erfasst gemeinsame oder exklusive Zugriff auf die vertraulichen Code oder Daten gewährt wird.Wenn Access nicht mehr erforderlich ist, der Thread gibt den Besitz und können andere Threads versuchen, Zugriff zu erhalten.Abhängig von der Art der Synchronisation verwendet gleichzeitige Anforderungen für den Besitz möglicherweise mehrere Threads Zugriff auf freigegebene Ressourcen zur selben Zeit zulassen oder einige der Threads möglicherweise bis zur Freigabe des Objekts vom vorherigen Anschaffung blockiert.Beispiele für 
include kritische Abschnitte in c/c++, die EnterCriticalSection und LeaveCriticalSection Zugriff-Routinen, die WaitForSingleObject-Funktion in c/c++ und die Lock-Anweisung und die Monitor-Klasse in c# zu verwenden.

Die Wahl der Synchronisierungsmechanismus muss mit Sorgfalt, vorgenommen werden, da eine fehlerhafte Synchronisierung zwischen Threads kann reduzieren anstatt verbessern die Leistungsvorteile, die das Ziel des multithreading.Folglich ist es immer wichtiger, um Situationen erkennen, in denen Threads aufgrund von Konflikte Sperre blockiert werden, die kein Fortschritt.

Die Leistungstools in Visual Studio 2010 beinhalten eine neue Profilerstellungsmethode – Ressourcenkonflikte Profilerstellung –, können Sie die Parallelität Konflikte zwischen Threads zu erkennen.

In diesem Artikel ich eine Untersuchung Konflikte Profilerstellung durchlaufen und mithilfe der IDE von Visual Studio 2010 und die Befehlszeilenprogramme gesammelten Daten erklären.Ich werde auch zeigen Sie wie Analysieren von Daten in Visual Studio 2010, und erfahren Sie, wie aus einer Analyseansicht auf einen anderen verschieben, während Sie Ihre Untersuchungen Konflikte durchführen.Dann repariert ich den Code und die Profilerstellung für die geänderte Anwendung mit der ursprünglichen Profilerstellung Ergebnisse überprüfen, dass das Update verringert sich die Anzahl der Konflikte Ergebnisse vergleichen.

Beginnen Sie mit dem Problem

Z. B. werde ich verwenden dieselbe Matrix Multiplikation Anwendung Hazim Shafi in seinem Blogbeitrag verwendet “ Leistung Muster 1: Identifizieren von Sperren Konflikte ” (blogs.msdn.com/hshafi/archive/2009/06/19/performance-pattern-1-identifying-lock-contention.aspx).Das Codebeispiel in C++ geschrieben wurde, aber die Konzepte, die ich eingehen werde an verwalteten Code gleichermaßen anwendbar sind.

Die Beispielanwendung für die Matrix Multiplikation verwendet mehrere Threads auf die beiden Matrizen multipliziert werden soll.Jeder Thread Ruft einen Teil des Auftrags und führt den folgenden Codeausschnitt:

for (i = myid*PerProcessorChunk; 
     i < (myid+1)*PerProcessorChunk; 
     i++) {
  EnterCriticalSection(&mmlock);
  for (j=0; j<SIZE; j++) {
    for (k=0; k<SIZE; k++) {
      C[i][j] += A[i][k]*B[k][j];
    }
  }
  LeaveCriticalSection(&mmlock);
}

Jeder Thread hat eine eigene ID (Myid) und ist verantwortlich für die Berechnung der Anzahl der Zeilen (mindestens), in der sich ergebenden Matrix C, Matrizen A und B als Eingabe verwenden. Schließen Code-Prüfung zeigt, dass keine wirklich mehrdeutig Write-Freigabe erfolgt, und jeder Thread in eine andere Zeile von c schreibt. Der Entwickler entschieden noch die Zuweisung der Matrix mit einem kritischen Abschnitt zu schützen. Ich vielen den Entwickler dazu, wie ich eine gute Möglichkeit zum Veranschaulichen der neuen Visual Studio 2010 Leistungstools redundanten Synchronisierung schnell und einfach auffinden können.

Profilerstellung für die Datensammlung

Vorausgesetzt, Sie haben eine Visual Studio-Projekt mit dem zuvor gezeigten Code (auch wenn es nicht erforderlich ist – Zuordnen des Profilers zu jeder Anwendung, die bereits ausgeführt wird), Sie Konflikte überprüfen Sie im Assistenten zum Starten von Leistung auf die Profilerstellung starten.

Wählen Sie auf der ersten Seite des Assistenten in Abbildung 1 gezeigten Parallelität, und stellen Sie sicher, dass die Option “ sammeln Konflikte Ressourcendaten ” aktiviert ist. Beachten Sie diese Ressourcenkonflikte Parallelität Profilerstellung funktioniert für alle Versionen des Windows-Betriebssystems. Die Option “ darstellen, das Verhalten einer Multithreadanwendung ” erfordert Windows Vista- oder Windows 7.

image: Enabling Concurrency Resource Profiling
Abbildung 1 Profilerstellung aktivieren Parallelität Resource

Stellen Sie auf der zweiten Seite des Assistenten sicher, dass das aktuelle Projekt als Ziel verwendet wird. Auf der letzten Seite des Assistenten sicher, dass die Option “ nach Abschluss des Assistenten die Profilerstellung starten ” aktiviert ist, und klicken Sie auf "Fertig stellen". Die Anwendung startet unter dem Profiler ausführen. Wenn er beendet wird, die Profilerstellung Datendatei im Leistungs-Explorer-Fenster angezeigt wird (siehe Abbildung 2).

image: Performance Profiling Result File in Performance Explorer
Abbildung 2 Result-Datei im Leistungs-Explorer Profilerstellung Leistung

Der Profilerstellung Bericht automatisch in Visual Studio geöffnet und zeigt die Leistungsergebnisse für die Untersuchung in der Zusammenfassungsansicht, die in Abbildung 3 angezeigt wird.

image: Summary View of the Profiling Report
Abbildung 3 Zusammenfassung anzeigen des Berichts Profilerstellungs-

Profilerstellung Analysefunktionen

Bewirkt, dass nicht alle Synchronisierungen Sperrungskonflikte. Wenn eine Sperre verfügbar ist, versucht, eine Besitz der Sperre blockiert nicht die Ausführung des Threads und kein Konflikt geschieht. Resource Konflikte Profilerstellungs-Modus der Profiler sammelt Daten für die von Synchronisierungsereignissen, die Konflikte verursachen und meldet keine erfolgreiche (entsperrt) Ressource Übernahmen. Wenn Ihre Anwendung kein Konflikte verursacht, werden keine Daten erfasst. Wenn Sie Daten abrufen, bedeutet dies die Anwendung sperren Konflikte.

Für jeden Konflikt die Profiler-Berichte die thread-wurde blockiert, wenn der Konflikt (Ressourcen- und Aufruf-Stack) aufgetreten ist, wenn der Konflikt aufgetreten ist (Zeitstempel) und die Zeitspanne (Länge), dass der Thread versucht blockiert wurde, eine Sperre zu erhalten, geben einen kritischen Abschnitt, warten Sie, bis ein einzelnes Objekt und so weiter.

Beim Öffnen der Datei zunächst sehen die Zusammenfassungsansicht (Abbildung 3), mit drei Hauptbereiche Sie, die Sie für kurze Diagnose verwenden können:

  1. Konflikte Diagramm zeigt die Anzahl der Konflikte pro Sekunde, die während der Lebensdauer der Anwendung dargestellt. Visuell Überprüfen von Konflikten Spitzen oder wählen Sie ein Zeitintervall aus, und vergrößern Sie hinein, oder filtern Sie die Ergebnisse. Filtern die Daten re-analyzes und Daten außerhalb der ausgewählten Intervall entfernt.
  2. Die höchste Contended Resources-Tabelle listet die Ressourcen auf, die meisten erkannten Konflikte verursacht.
  3. In der Tabelle am Contended Threads werden die Threads mit der höchsten Anzahl der Konflikte aufgelistet. In dieser Tabelle wird die Anzahl der Konflikte als Kriterium, nicht die Länge der Konflikte verwendet. Daher möglicherweise einen Thread, der in einer einzelnen Konflikte für längere Zeit blockiert wird, aber nicht in der Zusammenfassungsansicht angezeigt werden. Ein Thread, der viele sehr kurzen Konflikte mit jeder das Blockieren des Threads nur sehr kurze Zeit, Konflikte aufgetreten wäre auf der anderen Seite in der Zusammenfassungsansicht dargestellt werden.

Wenn eine Ressource, die für die meisten Konflikte verantwortlich ist, überprüfen Sie die Ressource näher. Wenn Sie einen Thread, der eine große Anzahl von Konflikte auftreten, die Sie nicht erwartet beobachten, untersuchen Sie die Konflikte des Threads.

Beispielsweise können Sie für das Abbildung 3 sehen, dass kritische Abschnitt 1 für fast alle (99.90 Prozent) Konflikte in der Anwendung verantwortlich ist. Diese Ressource zu Let’s genauer untersuchen.

Ressourcennamen und Thread-IDs in der Zusammenfassungsansicht werden als Hyperlinks angezeigt. Klicken Sie auf den kritischen Abschnitt 1 überträgt, die Sie an die Ressourceneinzelheiten anzeigen (siehe Abbildung 4), der Kontext auf die bestimmte Ressource festgelegt ist, kritischer Abschnitt 1.

image: Resource Details View
Abbildung 4 Details zeigen

Ressourcendetails

Im obere Teil der Ressource Detailansicht zeigt ein zeitbasierte Diagramm, in dem jeder horizontale Linie an einen Thread angehört. Die Zeilen sind von der Stamm-Funktion Thread beschriftet, wenn der name des verwalteten Threads im Code (z. B. mithilfe der C#-System.Threading.Thread.Name-Eigenschaft). Ein Block in dieser Zeile stellt einen Konflikt des Threads auf die Ressource. Die Blocklänge wird die Länge der Konkurrenz. Blöcke aus verschiedenen Zeilen können in der Zeit, überlappen, die d., mehrere Threads gleichzeitig auf die Ressource gesperrt h..

Die gesamte Zeile ist ein Sonderfall. Es einem bestimmten Thread gehört nicht, sondern alle Konflikte aller Threads auf diese Ressource (es ist tatsächlich eine Projektion von Blöcken, die Konflikte in der Zeile) enthält. Wie Sie sehen können, kritischer Abschnitt 1 sehr beschäftigt war – es scheint leeren Feldern in einer Summe Zeile haben.

Sie können in einen bestimmten Teil des Diagramms vergrößern, indem eine Zeitspanne, die mit der linken Maustaste (mit der linken Maustaste an dem Punkt in dem Diagramm zu starten, und ziehen Sie den Mauszeiger auf der rechten Seite werden soll). Es gibt zwei Links im oberen rechten Bereich des Diagramms – Zoom zurücksetzen und verkleinern. Zoomen Zurücksetzen stellt die ursprüngliche Ansicht wieder her. Verkleinern Sie Sie wieder von un-zooming Schritt des Diagramms genauso springen Sie vergrößert wird.

Das allgemeine Muster der Konkurrenz Blöcke können Sie auf einige Schlussfolgerungen zu ihrer Ausführung der Anwendung führen. Beispielsweise können Sie sehen, dass Konflikte von verschiedenen Threads in Zeit stark überlappende sind, die Hinweise auf eine kleiner als optimale Parallelisierung. Jeder Thread ist auf die Ressource, die viel länger, als er ausgeführt wird, und es noch eine andere Hinweise auf die Anwendung Leistungseinbuße ist gesperrt.

Details-Funktion

Im unteren Teil der Ressource Detailansicht ist eine Aufrufliste Konflikte – keine Daten werden angezeigt, bis Sie eine bestimmte Konflikte auswählen. Wenn Sie einen Block auswählen, wird der entsprechende Stapel im unteren Bereich angezeigt. Sie können auch über einen Block Konflikte im Diagramm bewegen, ohne darauf klicken, und ein Popup-Fenster wird Ihnen den Stapel und die Länge der Konkurrenz.

Wie Sie in der Aufrufliste Konflikte, eine der Beispiel-Anwendung Funktionen aufgerufene MatMult aufgeführt ist, sehen, damit Sie wissen, war die Ursache für die Konkurrenz. Um zu bestimmen, welche Codezeile die Funktion für die Konkurrenz verantwortlich ist, doppelklicken Sie auf den Namen der Funktion in der Aufruf StackPanel-Element. Gelangen Sie zu der Funktion Detailansicht in Abbildung 5 dargestellt.

image: Function Details View
Abbildung 5 Function Detailansicht

In dieser Ansicht sehen Sie eine grafische Darstellung der Funktionen, die MatMult aufgerufen sowie Funktionen, die innerhalb der Sie aufgerufen wurden. Im unteren Bereich der Ansicht zeigt deutlich, dass EnterCriticalSection(&mmlock) für die ganze Zeit blockiert Threads zuständig ist.

Wenn Sie wissen, welche Codezeile für Konflikte zuständig ist, können Sie Ihre Entscheidung für die Synchronisierung auf diese Weise implementieren Gliederung überdenken. Handelt es sich um die beste Möglichkeit, Ihren Code zu schützen? Ist Sie überhaupt Schutz erforderlich?

In der Anwendung wird mithilfe eines kritischen Abschnitts in diesem Code ist unnötig, da Threads Schreibvorgänge freizugeben, die nicht den Matrixzeilen für dasselbe Ergebnis. Der Visual Studio-Leistungstools erhalten Sie den Punkt, in dem Sie die Verwendung von Mmlock, auskommentieren können erheblich beschleunigen der Anwendung. Wenn nur wurden immer so einfach!

Eine ausführlichere Beschreibung der Funktion Ansicht finden Sie in des Visual Studio-Profiler-Team Blogs blogs.msdn.com/profiler/archive/2010/01/19/vs2010-investigating-a-sample-profiling-report-function-details.aspx von .

Thread-Details

Wie bereits erwähnt, bietet Zusammenfassungsansicht einen guten Ausgangspunkt für Ihre Untersuchung. Durch die Tabellen am Contended Ressourcen und den Threads Contended betrachten, können Sie die weitere Vorgehensweise entscheiden. Wenn Sie feststellen, dass einer der Threads verdächtig aussieht, da es in der oberen Liste umstrittenen Threads werden soll nicht, empfiehlt es sich, dem Thread näher zu erteilen.

Klicken Sie auf die Thread-ID in der Zusammenfassung Ansicht so wechseln Sie zu der Threaddetails anzeigen (siehe Abbildung 6). Obwohl diese Ansicht der Ressource Detailansicht ähnelt, hat eine andere Bedeutung, da es Konflikte im Zusammenhang mit der ausgewählten Thread angezeigt werden. Jeder horizontale Linie stellt eine Ressource, die der Thread für die Lebensdauer Thread konkurriert wurde. On this chart you won’t see contention blocks overlapping in time because that would mean the same thread was blocked on more than one resource at the same time.

image: Thread Details View with Selected Contention Block
Figure 6 Thread Details View with Selected Contention Block

Beachten Sie, dass WaitForMultipleObjects (das ich hier nicht angezeigt wird) separat verarbeitet wird und mit einer einzigen Diagramm Linie für die Gruppe von Objekten dargestellt. Dies ist, weil der Profiler alle Parameterobjekte von WaitForMultipleObjects als eine Einheit behandelt.

Der Thread Detailansicht auch gelten alle Bearbeitungen, die Sie in der Resource-Detailansicht (im Diagramm ein-und Zoomen, bestimmte Konflikte auswählen und die Dauer in Millisekunden sowie den aufrufenden Stapel anzeigen) ausführen können. Doppelklicken Sie auf den Namen der Funktion im Bereich Aufrufliste Konflikte Navigieren zu der Funktion Detailansicht dieser Funktion.

Im Beispiel können Sie sehen, dass der Thread mehr Zeit verbringt als die Ausführung in der Anfangsphase der Ausführung blockiert, und wird dann für längere Zeit auf einen Satz von mehrere Handles blockiert. Wie der letzte Block verursacht wird, durch andere Threads auf den Abschluss gewartet, Hinweisen frühen Konflikte Thread nicht optimale Nutzung, verursacht des Threads in einem gesperrten Zustand mehr als in einem ausführenden Status befinden.

Wenig nach unten das Problem

Wie Sie vielleicht bemerkt haben, werden die Diagramm Achsenbeschriftungen Hyperlinks. Dies ermöglicht das Wechseln zwischen detaillierte Ansichten von Ressourcen und Threads, den erforderlichen Kontext für die Ansicht bei jedem festlegen. Dies kann in eine iterative Ansatz zum Auffinden und Lösen eines Problems hilfreich sein. Beispielsweise können Sie Ressourcen R1 überprüfen, die viele Threads blockiert. Sie können aus den Ressourceneinzelheiten angezeigt werden soll, um eine detaillierte Ansicht eines Thread T1 und finden Sie heraus, dass es nicht nur auf R1, aber manchmal auch auf R2-Ressource blockiert wurde. Sie können dann in die Details von R2 eintauchen, und beobachten Sie alle Threads, die von R2 blockiert wurden. Nächste können Sie auf die Bezeichnung des Thread T2, das Ihre Aufmerksamkeit auf alle Ressourcen zu überprüfen, die blockiert v2 zeichnet und so weiter.

Konflikte Profilerstellungsdaten wird nicht Ihnen explizite Antwort auf die Frage, die zu einem bestimmten Zeitpunkt eine Sperre hält. Angegebenen fair Synchronisierungsobjekt zwischen Threads und Ihre Kenntnisse in Bezug auf das Verhalten der Anwendung verwendet, Sie können jedoch eine mögliche Sperrenbesitzer (ein Thread, der in Sperrenübernahme Synchronisierung erfolgreich) identifizieren, indem Sie pivotieren Ressourcendetails-Daten an den Thread Details und sichern.

Nehmen wir beispielsweise an, in der der Thread Detailansicht ein Threads T, der blockiert ist auf Ressource R t Zeit angezeigt. Können, wechseln zu der Ressource Detailansicht R, indem Sie auf die Bezeichnung R und alle Threads, die blockiert wurden auf R während der Anwendungslebensdauer der angezeigt. Zeit (t) sehen Sie eine Reihe von Ihnen (einschließlich T) blockiert r. Ein Thread, der nicht auf R t Zeit blockiert ist ein möglicher Sperre Inhaber.

Erwähnt zuvor, dass insgesamt Linie im Diagramm eine Projektion alle Konflikte blockiert ist. Die gesamte Beschriftung ist auch ein Hyperlink, aber vom Resource Detailansicht, die Konflikte dauert anzeigen (siehe Abbildung 7), ist eine Sammlung von Konflikten Aufrufstrukturen pro Ressource. Der Pfad zu der entsprechenden Ressource Aufrufstruktur hot wird Sie aktiviert. Diese Ansicht zeigt die Konflikte und Blockieren Zeit Statistiken für die einzelnen Ressourcen und für die einzelnen Knoten (Funktion) in der Aufrufstruktur Ressource. Im Gegensatz zu den anderen Ansichten dieser Konflikte Stapeln in der Aufrufstruktur Ressourcen genauso wie in anderen Modi Profilerstellung aggregiert und können Sie Statistiken für die Gesamtheit der Anwendung ausgeführt.

image: Contention View with Hot Path Applied to Critical Section 1
Abbildung 7 Konflikte anzeigen mit Langsamster Pfad angewendet, um kritische Abschnitt 1

Aus der Sicht Konflikte können Sie die Ressourceneinzelheiten Zurückwechseln zur Ansicht für jede Ressource, die über das Kontextmenü. Zeigen Sie auf eine Ressource, mit der rechten Maustaste der Maus, und wählen Sie Konflikte Resource-Details anzeigen. Andere interessanten Aktionen sind auch im Kontextmenü verfügbar. Als allgemeine Vorschlag, untersuchen Sie die Kontextmenüs in der Profiler – recht hilfreich sein können.

Klicken Sie auf die Beschriftung Summe der Thread Details-Ansicht, um die Prozesse anzuzeigen, in dem der Thread aktiviert (siehe Abbildung 8). In dieser Ansicht angezeigt werden können, wenn der Thread relativ zur Startzeit Anwendung gestartet wurde, wenn er beendet wurde, ausgeführt wie lange darauf, wie viele Konflikte er aufgetreten ist, und wie lange es über alle Konflikte (in Millisekunden und als Prozentsatz der Lebensdauer des Threads) blockiert wurde.

image: Processes View
Abbildung 8 Ansicht Prozesse

Erneut, es ist möglich, zur Ansicht Threaddetails für alle Threads erneut über das Kontextmenü aufrufen – wählen Sie einen Thread von Interesse, mit der rechten Maustaste, und wählen Sie Thread Konflikte Details anzeigen.

Eine andere mögliche Untersuchung Fluss wäre die Ansicht "Prozesse direkt anzuzeigen, wenn die Datei geöffnet wird, Sortieren die Threads, indem Sie auf der Titelleiste eines der verfügbaren Spalten (z. B. sortieren Threads durch die Anzahl der Konflikte), wählen Sie einen der Threads und wechseln Sie in das Diagramm Konflikte Details des Threads über das Kontextmenü.

Beheben Sie das Problem und die Ergebnisse vergleichen

Wenn Sie die Hauptursache für die Sperre Konflikte in der Anwendung gefunden haben, können Sie den kritischen Abschnitt Mmlock kommentieren und führen Sie erneut die Profilerstellung:

for (i = myid*PerProcessorChunk; 
     i < (myid+1)*PerProcessorChunk; 
     i++) {
  // EnterCriticalSection(&mmlock);
  for (j=0; j<SIZE; j++) {
    for (k=0; k<SIZE; k++) {
      C[i][j] += A[i][k]*B[k][j];
    }
  }
  // LeaveCriticalSection(&mmlock);
}

Sie würden die Anzahl der Konflikte verringern und die Profilerstellung in der Tat geänderten Code Berichte nur eine Sperre Konkurrenz wie in Abbildung 9 erwarten.

image: Summary View of Profiling Results for Fixed Code
Abbildung 9 Zusammenfassung anzeigen der Profilerstellungs-Ergebnisse für feste Code

Wir können auch die neue und die frühere Leistungsergebnisse in Visual Studio vergleichen. Zu diesem Zweck wählen Sie beide Dateien im Leistungs-Explorer (Wählen Sie eine Datei, drücken Sie UMSCHALT oder STRG und wählen Sie einen anderen), dann mit der rechten Maustaste, und wählen Sie die Leistungsberichte vergleichen.

Ein Vergleichsbericht wird angezeigt, wie in der Abbildung 10 . In der Anwendung Beispiel sehen Sie die entsprechende Anzahl von inklusive Konflikte der Funktion MatMult aus 1,003 0 abgelegt.

image: Comparison Report
Abbildung 10 Vergleichsbericht

Alternative Data Collection-Methoden

Wenn Sie für Sampling oder Instrumentation Profilerstellung Ihrer Leistungssitzung erstellen, können Sie immer es später an Parallelität Modus konvertieren. Eine Möglichkeit, dies schnell ist das Profilerstellung Modus-Menü im Leistungs-Explorer verwenden. Wählen Sie einfach den Modus werden soll, und Sie sind gut zu wechseln.

Sie können die Einstellung der Eigenschaften der Sitzung durchgehen. Zeigen Sie auf Ihre Sitzung im Leistungs-Explorer, mit der rechten Maustaste, um das Kontextmenü anzuzeigen, und wählen Sie Eigenschaften. Die Registerkarte Allgemein der Eigenschaften können Sie die Profilerstellung Sitzungsmodus und anderen Parametern der Profilerstellung festlegen.

Sobald Ihre Profilerstellungsmodus festgelegt ist für Parallelität (oder Analyse, dass), können Sie entweder Markteinführung Ihrer Anwendung (ist bereits in der Liste mit Zielen Sie Leistungs-Assistent verwendet, oder Sie können Sie es manuell hinzufügen), oder Sie können Anfügen an eine Anwendung, die ausgeführt wird. Leistung-Explorer können Sie die Steuerelemente für diese Aufgaben wie Abbildung 11 dargestellt.

image: Profiling Controls of Performance Explorer
Abbildung 11 Profilerstellungs-Steuerelemente von Leistungs-Explorer

Der Visual Studio-Benutzeroberfläche wird eine Reihe von Anleitungen zum Sammeln von Profilerstellungsdaten automatisiert. Es ist jedoch möglich, Sammeln von Profilerstellungsdaten mithilfe von Befehlszeilenprogrammen, die für die automatische Ausführung und Skripts hilfreich sein kann.

Starten die Anwendung im Modus Profilerstellung Konflikte, öffnen Sie die Visual Studio-Eingabeaufforderung (die alle Profiler-Binärdateien in Ihrem Pfad entweder X 86 oder x64-Tools versetzt) und gehen Sie folgendermaßen vor:

  1. VSPerfCmd.exe /start:CONCURRENCY, RESOURCEONLY/output: <YourOutputFile>

  2. VSPerfCmd.exe /launch: < Your Application > /args: “ < Your Application Argumente > ”

  3. Führen Sie das Szenario

  4. VSPerfCmd.exe / trennen

    • Dieser Schritt ist nicht erforderlich, wenn die Anwendung beendet, aber es keinen Schaden verursacht, Sie in Ihre Skripts hinzufügen zu können.
  5. VSPerfCmd.exe /shutdown

    Jetzt können Sie zu Analysezwecken YourOutputFile.VSP in Visual Studio öffnen.

Wenn Sie eine Anwendung, die bereits ausgeführt wird haben, können Sie mithilfe dieser Schritte den Profiler anfügen:

  1. VSPerfCmd.exe /start:CONCURRENCY, RESOURCEONLY/output: <YourOutputFile>
  2. VSPerfCmd.exe / anfügen: < PID oder Prozessname >
  3. Führen Sie das Szenario
  4. VSPerfCmd.exe / trennen
  5. VSPerfCmd.exe /shutdown

Eine ausführlichere Erläuterung der verfügbaren Befehlszeilenoptionen kann msdn.microsoft.com/library/bb385768(VS.100)-gefunden werden.

Verschiedene Ansichten von Visual Studio können Sie die gesammelten Daten genau zu untersuchen. Einige Ansichten bieten einen Überblick über die Lebensdauer der Anwendung als Ganzes, während andere Benutzer auf bestimmte Konflikte konzentrieren – die wertvollsten verwenden.

Beim Analysieren der Ergebnisse der Profilerstellung können Sie Übergänge von einer Ansicht zu einer anderen durch Hyperlinks, doppelklickt oder Kontextmenüs, oder Sie können direkt auf beliebige verfügbare Ansicht über ein Dropdown-Menü wechseln. Abbildung 12 kurz beschrieben die Ansichten.

Abbildung 12 Analyseansichten

View Beschreibung
Zusammenfassung Zusammenfassende Informationen wird als Ausgangspunkt für Ihre Untersuchung dargestellt. Hierbei handelt es sich um die erste Ansicht angezeigt, und öffnet automatisch, nachdem eine Profilerstellungssitzung über ist und der Ergebnisdatei bereit ist.
Rufen Sie die Struktur Aggregierte Aufrufstruktur der Stapel für alle Konflikte. Hier können Sie sehen, welche Stapel verantwortlich für die Konflikte wurden.
Modules Eine Liste der Module, die Funktionen enthalten, die jede was zu einem Konflikt sind. Jedes Modul verfügt über eine Liste der relevanten Funktionen und die Anzahl der erkannten Konflikte.
Aufrufer/Aufgerufener Eine drei Bereichen Ansicht stellt Funktionsweise von F, alle Funktionen, die F aufrufen und Funktionen, die von F aufgerufen werden (nur Aufrufe führte Konflikte, natürlich).
Functions Eine Liste aller erkannten Funktionen auf jedem Stapel Konflikte mit zugeordneten Daten.
Zeilen Die Funktion Zeilen im Quellcode.
Ressourcendetails Details zu einer bestimmten Ressource (z. B. eine Sperre), alle Threads, die blockiert wurden auf ihn während der Anwendungslebensdauer der angezeigt.
Thread-Details Informationen über einen bestimmten Thread wurde für alle Ressourcen (z. B. Sperren) anzuzeigen, die des Threads blockiert.
Ressourcenkonflikte Ähnlich wie bei der Aufrufstruktur anzeigen, aber hier Aufrufstrukturen pro Ressource für die Konkurrenz getrennt werden. Diese Ansicht stellt also eine Reihe von Aufrufstrukturen, jedes enthaltenden Transportstacks, die auf eine bestimmte Ressource blockiert wurden.
Markierungen Eine Liste der automatisch und manuell aufgezeichneten einschließen, wobei jedes Zeichen mit seinen Zeitstempel und die Werte der Leistungsindikatoren von Windows verknüpft ist.
Prozesse Eine Liste der Prozesse, untersucht, wobei jeder Prozess verfügt über eine Liste von Threads und jeder Thread ist die Anzahl der Konflikte, die er aufgetreten ist und die zusammengefassten blockierten Zeitdauer attributiert.
Details-Funktion Details zu einer bestimmten Funktion, einschließlich der Funktionen es Aufrufe und gesammelten Daten.
IPs Eine Liste der Anweisung Zeiger, wobei Konflikte aufgetreten (auch eine Liste mit Funktionen wie EnterCriticalSection, WaitForSingleObject usw., da, wo Konflikte tatsächlich passiert).

Die neue Ressourcenkonflikte Profilerstellung Features in Visual Studio sollten Sie Leistungsprobleme zu entdecken, indem Threadsynchronisierung im Code und ermöglichen es Ihnen, verbessern Ihre Anwendung Common Language Runtime geändert wird, reduzieren oder vermeiden unnötige Synchronisierung helfen.

Maxim Goldin* ist als senior Software Design Engineer bei Microsoft. Er hat seit 2003 im Visual Studio-Engineering Team gearbeitet. Er kann unter mgoldin@microsoft.com-und He-Blogs blogs.msdn.com/b/mgoldin-erreicht werden.*

Weitere Informationen zur Leistung untersuchen Kapitalflüsse finden Sie in meinem Blogbeitrag Begleit blogs.msdn.com/b/mgoldin/archive/2010/04/22/resource-contention-concurrency-profiling-in-visual-studio-2010-performance-investigation-flows.aspx von .

Unser Dank gilt den folgenden technischen Experten für die Durchsicht dieses Artikels: Steve Carroll, Anna Galaeva, Daryush Laqab, Marc Popkin-Paine, Chris Schmich und Colin Thomsen