Optymalizacje sterowane profilem

Optymalizacja sterowana profilem (PGO) umożliwia optymalizowanie całego pliku wykonywalnego, w którym optymalizator używa danych z przebiegów testowych pliku .exe lub .dll. Dane reprezentują prawdopodobną wydajność programu w środowisku produkcyjnym.

Optymalizacje sterowane profilem są dostępne tylko dla obiektów docelowych natywnych x86, x64 lub ARM64. Optymalizacje sterowane profilem nie są dostępne dla plików wykonywalnych uruchamianych w środowisku uruchomieniowym języka wspólnego. Nawet jeśli tworzysz zestaw z mieszanym kodem natywnym i zarządzanym (przy użyciu opcji kompilatora /clr ), nie można użyć optymalizacji sterowanej profilem tylko w kodzie natywnym. Jeśli spróbujesz skompilować projekt z tymi opcjami ustawionymi w środowisku IDE, zostanie wyświetlony błąd kompilacji.

Uwaga

Informacje zebrane z przebiegów testów profilowania zastępują optymalizacje, które w przeciwnym razie będą obowiązywać, jeśli określisz /Ob, /Os lub /Ot. Aby uzyskać więcej informacji, zobacz /Ob (wbudowane rozszerzenie funkcji) i /Os, /Ot (Preferuj mały kod, Preferuj szybki kod).

Kroki optymalizacji aplikacji

Aby użyć optymalizacji opartej na profilu, wykonaj następujące kroki, aby zoptymalizować aplikację:

  • Skompiluj co najmniej jeden plik kodu źródłowego za pomocą /GL.

    Każdy moduł utworzony za pomocą /GL można zbadać podczas przebiegów testów optymalizacji z przewodnikiem profilu w celu przechwycenia zachowania w czasie wykonywania. Każdy moduł w kompilacji optymalizacji sterowanej profilem nie musi być kompilowany przy użyciu /GL. Jednak tylko te moduły skompilowane za pomocą /GL są instrumentowane i później dostępne dla optymalizacji sterowanych profilem.

  • Połącz przy użyciu /LTCG i /GENPROFILE lub /FASTGENPROFILE.

    Użycie zarówno /LTCG , jak i /GENPROFILE lub /FASTGENPROFILE tworzy .pgd plik po uruchomieniu instrumentowanej aplikacji. Po dodaniu danych przebiegu testowego .pgd do pliku można go użyć jako danych wejściowych do następnego kroku linku (tworząc zoptymalizowany obraz). Podczas określania /GENPROFILE można opcjonalnie dodać argument PGD=nazwa_pliku , aby określić nazwę inną niżdefault lub lokalizację .pgd pliku. Kombinacja opcji konsolidatora /LTCG i /GENPROFILE lub /FASTGENPROFILE zastępuje przestarzałą opcję konsolidatora /LTCG:PGINSTRUMENT .

  • Wykonaj profilowanie aplikacji.

    Za każdym razem, gdy profilowana sesja EXE zakończy się lub profilowana biblioteka DLL zostanie zwolniona, appname!N.pgc tworzony jest plik. .pgc Plik zawiera informacje o konkretnym przebiegu testu aplikacji. appname to nazwa aplikacji, a N to liczba rozpoczynająca się od 1, która jest zwiększana na podstawie liczby innych appname!N.pgc plików w katalogu. Jeśli przebieg testu nie reprezentuje scenariusza, który chcesz zoptymalizować, możesz usunąć .pgc plik.

    Podczas przebiegu testu można wymusić zamknięcie aktualnie otwartego .pgc pliku i utworzenie nowego .pgc pliku za pomocą narzędzia pgosweep (na przykład gdy koniec scenariusza testowego nie pokrywa się z zamknięciem aplikacji).

    Aplikacja może również bezpośrednio wywołać funkcję PGO, PgoAutoSweep, aby przechwycić dane profilu w momencie wywołania jako .pgc pliku. Może ona zapewnić dokładną kontrolę nad kodem ujętym w przechwyconych danych w .pgc plikach. Przykład użycia tej funkcji można znaleźć w dokumentacji PgoAutoSweep .

    Po utworzeniu instrumentowanej kompilacji zbieranie danych odbywa się domyślnie w trybie awaryjnym bez wątków, co jest szybsze, ale może być nieprecyzyjne. Używając argumentu EXACT do /GENPROFILE lub /FASTGENPROFILE, można określić zbieranie danych w trybie awaryjnym wątku, co jest bardziej precyzyjne, ale wolniejsze. Ta opcja jest również dostępna w przypadku ustawienia przestarzałej zmiennej środowiskowej Pogo Sejf Mode lub przestarzałej opcji konsolidatora /POGOSAFEMODE podczas tworzenia instrumentowanej kompilacji.

  • Połącz przy użyciu / LTCG i /USEPROFILE.

    Użyj opcji konsolidatora /LTCG i /USEPROFILE , aby utworzyć zoptymalizowany obraz. Ten krok przyjmuje jako dane wejściowe .pgd pliku. Po określeniu /USEPROFILE można opcjonalnie dodać argument PGD=nazwa_pliku, aby określić inną niż domyślną nazwę lub lokalizację .pgd pliku. Tę nazwę można również określić przy użyciu przestarzałej opcji konsolidatora /PGD . Kombinacja /LTCG i /USEPROFILE zastępuje przestarzałe /LTCG:PGOPTIMIZE i /LTCG:PGUPDATE opcje konsolidatora.

Można nawet utworzyć zoptymalizowany plik wykonywalny, a później określić, że dodatkowe profilowanie byłoby przydatne do utworzenia bardziej zoptymalizowanego obrazu. Jeśli jest dostępny instrumentowany obraz i jego .pgd plik, możesz wykonać dodatkowe przebiegi testów i ponownie skompilować zoptymalizowany obraz przy użyciu nowszego .pgd pliku, używając tych samych opcji konsolidatora /LTCG i /USEPROFILE .

Uwaga

Oba .pgc pliki i .pgd są typami plików binarnych. Jeśli są przechowywane w systemie kontroli źródła, unikaj wszelkich automatycznych przekształceń, które mogą być wykonywane w plikach tekstowych.

Optymalizacje wykonywane przez PGO

Optymalizacje oparte na profilu obejmują następujące kontrole i ulepszenia:

  • Inlining — na przykład jeśli funkcja A często wywołuje funkcję B, a funkcja B jest stosunkowo mała, optymalizacje oparte na profilu wbudowanej funkcji B w funkcji A.

  • Spekulacje na temat wywołań wirtualnych — jeśli wywołanie wirtualne lub inne wywołanie za pośrednictwem wskaźnika funkcji często jest przeznaczone dla określonej funkcji, optymalizacja sterowana profilem może wstawić warunkowo wykonywane bezpośrednie wywołanie do często docelowej funkcji, a bezpośrednie wywołanie może zostać podkreślone.

  • Rejestrowanie alokacji — optymalizacja na podstawie danych profilu powoduje lepsze rejestrowanie alokacji.

  • Podstawowa optymalizacja bloków — optymalizacja bloków w warstwie Podstawowa umożliwia często wykonywane podstawowe bloki, które są wykonywane czasowo w ramach danej ramki, które mają być umieszczane w tym samym zestawie stron (lokalność). Minimalizuje liczbę używanych stron, co minimalizuje obciążenie pamięcią.

  • Optymalizacja rozmiaru/szybkości — funkcje, w których program spędza najwięcej czasu wykonywania, można zoptymalizować pod kątem szybkości.

  • Układ funkcji — na podstawie wykresu wywołań i profilowanego zachowania wywołującego/wywoływanego funkcje, które zwykle znajdują się wzdłuż tej samej ścieżki wykonywania, są umieszczane w tej samej sekcji.

  • Optymalizacja gałęzi warunkowej — dzięki sondom wartości optymalizacje sterowane profilem mogą znaleźć, czy dana wartość w instrukcji switch jest używana częściej niż inne wartości. Następnie taką wartość można usunąć z instrukcji switch. Można to zrobić za pomocą ifelse ... instrukcji, w których optymalizator może porządkować if...else tak, aby blok if lub else został umieszczony jako pierwszy, w zależności od tego, który blok jest częściej prawdziwy.

  • Separacja nieaktywnego kodu — kod, który nie jest wywoływany podczas profilowania, jest przenoszony do specjalnej sekcji dołączanej na końcu zestawu sekcji. Skutecznie przechowuje tę sekcję poza często używanymi stronami.

  • Separacja kodu EH — ponieważ kod EH jest wykonywany tylko wyjątkowo, często można go przenieść do oddzielnej sekcji. Jest on przenoszony, gdy optymalizacje sterowane profilem mogą określać, że wyjątki występują tylko w wyjątkowych warunkach.

  • Funkcje wewnętrzne pamięci — czy rozszerzać element wewnętrzny, czy nie, zależy od tego, czy jest on często wywoływany. Funkcję wewnętrzną można również optymalizować na podstawie rozmiaru bloku operacji przenoszenia i kopiowania.

Następne kroki

Dowiedz się więcej o tych zmiennych środowiskowych, funkcjach i narzędziach, których można użyć w optymalizacjach z przewodnikiem profilu:

Zmienne środowiskowe optymalizacji sterowanych profilami
Te zmienne były używane do określania zachowania w czasie wykonywania scenariuszy testowania. Są one teraz przestarzałe i zastępowane przez nowe opcje konsolidatora. W tym dokumencie pokazano, jak przejść ze zmiennych środowiskowych do opcji konsolidatora.

PgoAutoSweep
Funkcja, którą można dodać do aplikacji, aby zapewnić szczegółową .pgc kontrolę przechwytywania danych plików.

pgosweep
Narzędzie wiersza polecenia, które zapisuje wszystkie dane profilu w .pgc pliku, zamyka .pgc plik i otwiera nowy .pgc plik.

pgomgr
Narzędzie wiersza polecenia, które dodaje dane profilu z co najmniej jednego .pgc pliku do .pgd pliku.

Instrukcje: scalanie wielu profilów PGO w jednym profilu
Przykłady użycia programu pgomgr .

Zobacz też

Dodatkowe narzędzia kompilacji kompilatora MSVC