Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit der profilgeführten Optimierung (PGO) können Sie eine gesamte ausführbare Datei optimieren. Der Optimierer verwendet Daten aus Testläufen der .exe oder .dll Datei. Die Daten repräsentieren die wahrscheinliche Leistung des Programms in einer Produktionsumgebung.
Hinweis
SPGO (Sample Profile-Guided Optimization) ist ein alternativer Ansatz, der hardwarebasierte CPU-Windows Leistungsindikatoren anstelle der Instrumentierung verwendet. SPGO erfordert keinen instrumentierten Build – Sie profilieren eine vorhandene Release-Binärdatei mithilfe von xperf. Weitere Informationen finden Sie im Tutorial zur beispielbasierten Profile-Guided Optimization (SPGO).
Profilgesteuerte Optimierungen sind nur für systemeigene x86-, x64- oder ARM64-Ziele verfügbar. Profilgesteuerte Optimierungen sind nicht für ausführbare Dateien verfügbar, die in der Common Language Runtime ausgeführt werden. Auch wenn Sie eine Assembly mit einer Mischung aus nativem und verwaltetem Code (mithilfe der Compileroption /clr) erstellen, können Sie die profilgesteuerte Optimierung nicht für den nativen Code verwenden. Der Versuch, ein Projekt zu erstellen, bei dem diese Optionen in der IDE festgelegt sind, verursacht einen Buildfehler.
Hinweis
Informationen, die aus Profilerstellungstests gesammelt werden, überschreiben Optimierungen, die andernfalls wirksam wären, wenn Sie /Ob, /Os oder /Ot angeben. Weitere Informationen finden Sie unter /Ob (Inlinefunktionserweiterung) und /Os, /Ot (Kompakten Code bevorzugen, Schnellen Code bevorzugen).
Schritte zum Optimieren Ihrer App
Um die profilgesteuerte Optimierung zu verwenden, führen Sie die folgenden Schritte aus, um Ihre App zu optimieren:
Kompilieren Sie eine oder mehrere Quellcode-Dateien mit /GL.
Der Compiler untersucht jedes Modul, das während profilgeführter Optimierungstests mit /GL erstellt wurde, um das Laufzeitverhalten zu erfassen. Sie müssen nicht jedes Modul in einem profilgeführten Optimierungsbuild mit /GL kompilieren. Allerdings sind nur mit /GL kompilierte Module instrumentiert und später für profilgeführte Optimierungen verfügbar.
Link mithilfe von /LTCG und /GENPROFILE oder /FASTGENPROFILE.
Wenn Sie sowohl /LTCG als auch /GENPROFILE oder /FASTGENPROFILE verwenden, erstellt die instrumentierte App beim Ausführen eine
.pgdDatei. Nachdem der.pgdDatei Testlaufdaten hinzugefügt wurden, können Sie sie als Eingabe für den nächsten Linkschritt (Erstellen des optimierten Bilds) verwenden. Wenn Sie /GENPROFILE angeben, können Sie optional ein PGD=filename-Argument hinzufügen, um einen nicht standardmäßigen Namen oder Speicherort für die.pgdDatei anzugeben. Die Kombination der Linkeroptionen /LTCG und /GENPROFILE oder /FASTGENPROFILE ersetzt die veraltete Linkeroption /LTCG: PGINSTRUMENT.Profilieren der Anwendung
Jedes Mal, wenn eine profilierte EXE-Sitzung endet oder eine profilierte DLL entladen wird, erstellt der Prozess eine
appname!N.pgcDatei. Eine.pgc-Datei enthält Informationen über einen bestimmten Anwendungstestlauf. Der App-Name ist der Name Ihrer App, und N ist eine Zahl, die mit 1 beginnt. Es erhöht sich basierend auf der Anzahl der anderenappname!N.pgcDateien im Verzeichnis. Sie können eine.pgc-Datei löschen, wenn der Testlauf kein zu optimierendes Szenario darstellt.Während einer Testausführung können Sie das Schließen der aktuell geöffneten
.pgcDatei und die Erstellung einer neuen.pgcDatei mithilfe des Hilfsprogramms "pgosweep " erzwingen (z. B. wenn das Ende eines Testszenarios nicht mit dem Herunterfahren der Anwendung übereinstimmt).Die Anwendung kann auch direkt eine PGO-Funktion aufrufen, PgoAutoSweep, um die Profildaten zum Zeitpunkt des Aufrufs als
.pgc-Datei zu erfassen. So können Sie den Code, der von den erfassten Daten in Ihren.pgc-Dateien abgedeckt wird, genauer kontrollieren. Ein Beispiel für die Verwendung dieser Funktion finden Sie in der PgoAutoSweep-Dokumentation.Wenn Sie den instrumentierten Build erstellen, erfolgt die Datenerfassung standardmäßig im nicht threadsicheren Modus, der schneller, aber möglicherweise ungenau ist. Mit dem Argument EXACT für /GENPROFILE oder /FASTGENPROFILE können Sie die Datenerfassung im threadsicheren Modus festlegen, der präziser, aber langsamer ist. Diese Option ist auch verfügbar, wenn Sie beim Erstellen des instrumentierten Builds die veraltete PogoSafeMode-Umgebungsvariable oder die veraltete /POGOSAFEMODE-Linkeroption festlegen.
Link mithilfe von /LTCG und /USEPROFILE.
Verwenden Sie sowohl die Linkeroptionen /LTCG als auch /USEPROFILE, um das optimierte Image zu erstellen. In diesem Schritt wird die
.pgdDatei als Eingabe verwendet. Wenn Sie /USEPROFILE angeben, können Sie optional ein PGD=filename-Argument hinzufügen, um einen nicht standardmäßigen Namen oder Speicherort für die.pgdDatei anzugeben. Sie können diesen Namen auch mit der veralteten /PGD-Linkeroption angeben. Die Kombination aus /LTCG - und /USEPROFILE-Linkeroptionen ersetzt die veralteten /LTCG:PGOPTIMIZE - und /LTCG:PGUPDATE-Linkeroptionen .
Es ist sogar möglich, die optimierte ausführbare Datei zu erstellen und später zu bestimmen, dass mehr Profilerstellung nützlich wäre, um ein optimiertes Image zu erstellen. Wenn das instrumentierte Bild und seine .pgd Datei verfügbar sind, können Sie weitere Testläufe ausführen und das optimierte Image mit der neueren .pgd Datei neu erstellen, indem Sie die gleichen Optionen für /LTCG und /USEPROFILE linker verwenden.
Hinweis
Bei den zwei Dateien .pgc und .pgd handelt es sich um Binärdateien. Wenn Sie sie in einem Quellcodeverwaltungssystem speichern, vermeiden Sie eine automatische Transformation, die möglicherweise in Textdateien erfolgt.
Von PGO ausgeführte Optimierungen
Profilgesteuerte Optimierungen umfassen die folgenden Prüfungen und Verbesserungen:
Inlining – Wenn beispielsweise Funktion A häufig Funktion B aufruft und Funktion B relativ klein ist, integrieren die profilgesteuerten Optimierungen Funktion B in Funktion A.
Virtuelle Aufruf-Spekulation: Wenn ein virtueller Aufruf oder ein anderer Aufruf durch einen Funktionszeiger häufig auf eine bestimmte Funktion abzielt, kann bei einer profilgesteuerten Optimierung ein bedingt ausgeführter direkter Aufruf dieser häufig angesteuerten Funktion eingefügt werden, und der direkte Aufruf kann inline umgesetzt werden.
Registerzuteilung: Die Optimierung auf der Grundlage von Profildaten führt zu einer besseren Registerzuteilung.
Basisblockoptimierung: Die Basisblockoptimierung ermöglicht, dass häufig ausgeführte Basisblöcke, die temporär innerhalb eines bestimmten Rahmens ausgeführt werden, in derselben Seitengruppe platziert werden (Lokalität). Das minimiert die Anzahl der verwendeten Seiten und damit den Arbeitsspeicherverbrauch.
Optimierung von Größe/Geschwindigkeit: Funktionen, für die das Programm die meiste Zeit benötigt, können auf Geschwindigkeit optimiert werden.
Funktionslayout: Auf Grundlage des Aufrufdiagramms und des profilierten Verhaltens von aufrufender/aufgerufener Funktion werden Funktionen, die tendenziell denselben Ausführungspfad verwenden, im selben Abschnitt platziert.
Optimierung der bedingten Verzweigung: Mit den Wertsonden kann durch profilgesteuerte Optimierungen herausgefunden werden, ob ein bestimmter Wert in einer switch-Anweisung öfter als andere Werte verwendet wird. Dieser Wert kann dann aus der switch-Anweisung herausgezogen werden. Dieselbe Optimierung kann mit
if...elseAnweisungen durchgeführt werden, bei denen der Optimierer dieif...elseso anordnen kann, dass entweder derifoderelseBlock zuerst platziert wird, je nachdem, welcher Block häufiger wahr ist.Dead Code Separation – Profilgeführte Optimierung verschiebt Code, der während der Profilerstellung nicht an einen speziellen Abschnitt am Ende des Abschnittssatzes aufgerufen wird. Damit wird dieser Abschnitt effektiv von den oft verwendeten Seiten getrennt.
EH-Code-Trennung: Da EH-Code nur in Ausnahmefällen ausgeführt wird, kann er oft in einen separaten Abschnitt verschoben werden. Profilgesteuerte Optimierungen verschieben sie, wenn sie bestimmen, dass die Ausnahmen nur unter außergewöhnlichen Bedingungen auftreten.
Speicher-Intrinsics – Ob ein Intrinsic expandiert wird oder nicht, hängt davon ab, ob es häufig aufgerufen wird. Eine Intrinsic-Funktion kann auch auf Grundlage der Blockgröße von Verschiebungen oder Kopien optimiert werden.
Nächste Schritte
Weitere Informationen zu diesen Umgebungsvariablen, Funktionen und Tools, die Sie in profilgeführten Optimierungen verwenden können, finden Sie in den folgenden Ressourcen:
Umgebungsvariablen für profilgesteuerte Optimierungen
Diese Variablen geben das Laufzeitverhalten von Testszenarien an. Sie sind nun veraltet und wurden durch neue Linkeroptionen ersetzt. In diesem Dokument wird gezeigt, wie Sie von den Umgebungsvariablen zu den Linkeroptionen wechseln.
PgoAutoSweep
Eine Funktion, die Sie Ihrer App hinzufügen können, um eine differenzierte Steuerung der Datenerfassung für Datei .pgc bereitzustellen.
pgosweep
Ein Befehlszeilen-Hilfsprogramm, das alle Profildaten in die .pgc-Datei schreibt, die .pgc-Datei schließt und eine neue .pgc-Datei öffnet.
pgomgr
Ein Befehlszeilen-Hilfsprogramm, mit dem der .pgc-Datei Profildaten aus einer oder mehreren .pgd-Dateien hinzugefügt werden.
Vorgehensweise: Zusammenführen mehrerer PGO-Profile in ein einzelnes Profil
Beispiele für pgomgr-Verwendung.
Beispielanleitung für Profile-Guided Optimization (SPGO)
Verwenden Sie CPU-Hardwareleistungsindikatoren anstelle der Instrumentierung. Kein instrumentierter Build erforderlich – vorhandene Release-Binärdatei mit xperf profilieren.