Profilgesteuerte Optimierungen (PGO)

Mit der profilgesteuerten Optimierung können Sie eine Ausgabedatei optimieren, indem der Optimierer Daten aus Testläufen der EXE- oder DLL-Datei verwendet. Die Daten stellen dar, wie das Programm sich in einer Produktionsumgebung wahrscheinlich verhalten wird.

Profilgesteuerte Optimierungen sind nur für systemeigene Ziele verfügbar: x86, die Itanium-Prozessorfamilie (IPF) oder x64. Profilgesteuerte Optimierungen sind für Ausgabedateien nicht verfügbar, die in der Common Language Runtime ausgeführt werden. Auch wenn Sie eine Assembly mit einer Mischung aus systemeigenem und verwaltetem Code (mit /clr kompiliert) produzieren, können Sie die profilgesteuerte Optimierung nicht für den systemeigenen Code verwenden.

Tipp

Informationen, die bei Testläufen für die Profilerstellung erfasst wurden, überschreiben Optimierungen, die sonst bei Angabe von /Ob, /Os oder /Ot aktiv sind. Weitere Informationen finden Sie unter /Ob (Inlinefunktionserweiterung) und /Os, /Ot (Kompakten Code bevorzugen, Schnellen Code bevorzugen).

Im Folgenden finden Sie eine Übersicht über die Verwendung profilgesteuerter Optimierungen:

  • Kompilieren von einer oder mehreren Quellcodedateien mit /GL

    Jedes mit /GL erstellte Modul kann während der profilgesteuerten Optimierungstestläufe untersucht werden, um das Laufzeitverhalten zu erfassen. Nicht jedes Modul in einem profilgesteuerten Optimierungsbuild muss mit /GL kompiliert werden. Jedoch werden nur die mit /GL kompilierten Module instrumentiert und sind später für profilgesteuerte Optimierungen verfügbar.

  • Verknüpfen mit /LTCG:PGINSTRUMENT

    /LTCG:PGINSTRUMENT erstellt eine leere PGD-Datei. Nachdem die Testlaufdaten zur PGD-Datei hinzugefügt wurden, kann sie als Eingabe für den nächsten Verknüpfungsschritt (Erstellen des optimierten Programms) verwendet werden. Beim Angeben von /LTCG:PGINSTRUMENT können Sie optional /PGD mit einem nicht standardmäßigen Namen oder Speicherort für die PGD-Datei angeben.

  • Profilieren der Anwendung

    Jedesmal, wenn eine profilierte EXE-Sitzung endet oder eine profilierte DLL entladen wird, wird eine appname!#.pgc-Datei erstellt. Eine PGC-Datei enthält Informationen über einen bestimmten Anwendungstestlauf. # ist eine bei 1 beginnende Nummer, die auf Basis der Anzahl anderer appname!#.pgc-Dateien im Verzeichnis inkrementiert wird. Sie können eine PGC-Datei löschen, wenn der Testlauf kein zu optimierendes Szenario darstellt.

    Während eines Testlaufs können Sie das Schließen der aktuell geöffneten PGC-Datei und das Erstellen einer neuen PGC-Datei mit dem pgosweep-Dienstprogramm erzwingen (z. B. wenn das Ende eines Testszenarios nicht mit dem Beenden der Anwendung einhergeht).

    Sie können die PogoSafeMode-Option verwenden, wenn Sie ein Profil für die Anwendung erstellen. Diese Option ermöglicht es Ihnen, anzugeben, ob Sie die Profilerstellung für die Anwendung im abgesicherten Modus oder im schnellen Modus durchführen möchten. Weitere Informationen über diese Modi finden Sie unter PogoSafeMode.

  • Verknüpfen mit /LTGC:PGOPTIMIZE

    /LTCG:PGOPTIMIZE erstellt das optimierte Bild. Bei diesem Schritt wird die PGD-Datei als Eingabe verwendet. Weitere Informationen finden Sie unter /LTCG:PGOPTIMIZE.

Es ist sogar möglich, die optimierte Ausgabedatei zu erstellen und später zu ermitteln, ob eine zusätzliche Profilierung zum Erstellen eines weiter optimierten Bilds sinnvoll wäre. Wenn das instrumentierte Bild und seine PGD-Datei verfügbar sind, können Sie zusätzliche Testläufe ausführen und das optimierte Bild mit der neueren PGD-Datei neu erstellen.

Im Folgenden finden Sie eine Liste der profilgesteuerten Optimierungen:

  • Inlinefunktion: Wenn beispielsweise eine Funktion A vorhanden ist, die häufig Funktion B aufruft und Funktion B relativ klein ist, wird bei der profilgesteuerten Optimierung Funktion B zu einer Inlinefunktion von Funktion A umgewandelt.

  • Spekulatives Laden virtueller Aufrufe: Wenn ein virtueller oder anderer Aufruf über einen Funktionszeiger häufig eine bestimmte Funktion zum Ziel hat, kann bei einer profilgesteuerten Optimierung ein bedingt ausgeführter direkter Aufruf der häufig als Ziel dienenden Funktion eingefügt und der direkte Aufruf als Inlinefunktion umgesetzt werden.

  • Registerzuweisung: Die Optimierung mit Profildaten führt zu einer besseren Registerzuweisung.

  • Basisblockoptimierung: Die Basisblockoptimierung ermöglicht, dass allgemein ausgeführte Basisblöcke, die temporär innerhalb eines bestimmten Rahmens ausgeführt werden, in denselben Seiten platziert werden (lokale Verweise). Dies minimiert die Anzahl der verwendeten Seiten und damit den Arbeitsspeicheraufwand.

  • Optimierung von Größe/Geschwindigkeit: Funktionen, für die das Programm viel 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 Verzweigungen: Anhand von Wertprüfungen kann bei profilgesteuerten Optimierungen ermittelt werden, ob ein bestimmter Wert in einer switch-Anweisung öfter als andere Werte verwendet wird. Dieser Wert kann dann aus der switch-Anweisung gezogen werden. Dasselbe Verfahren kann bei if/else-Anweisungen verwendet werden, bei denen der Optimierer die if/else-Anweisungen so anordnen kann, dass abhängig davon, welcher Block häufiger den Wert true hat, entweder der if- oder der else-Block zuerst platziert wird.

  • Abtrennung von totem Code: Während der Profilierung wird nicht aufgerufener Code in einen speziellen Bereich verschoben, der an das Ende der Gruppe von Abschnitten angehängt wird. Damit wird dieser Abschnitt effektiv von den oft verwendeten Seiten getrennt.

  • Abtrennung von EH-Code: Bei Ausnahmen ausgeführter EH-Code kann oft in einen separaten Abschnitt verschoben werden, wenn bei den profilgesteuerten Optimierungen ermittelt wird, dass die Ausnahmen nur unter Ausnahmebedingungen eintreten.

  • Systeminterner Speicher: Die Erweiterung systeminterner Funktionen kann besser entschieden werden, wenn festgestellt wird, ob eine systeminterne Funktion häufig aufgerufen wird. Eine systeminterne Funktion kann auch auf Grundlage der Blockgröße von Verschiebungen oder Kopien optimiert werden.

Weitere Informationen finden Sie unter Exemplarische Vorgehensweise : Verwenden profilgesteuerter Optimierung.

In diesem Abschnitt

Tools für die profilgesteuerte Optimierung (PGO)

Gewusst wie: Zusammenführen mehrerer PGO-Profile in einem einzigen Profil

Siehe auch

Referenz

C/C++-Buildtools