/LTCG
(Generowanie kodu w czasie połączenia)
Służy /LTCG
do przeprowadzania optymalizacji całego programu lub tworzenia instrumentacji optymalizacji opartej na profilu (PGO), przeprowadzania trenowania i tworzenia zoptymalizowanych pod kątem profilu kompilacji.
Składnia
/LTCG
[:
{INCREMENTAL
STATUS
OFF
|NOSTATUS
||}]
Te opcje są przestarzałe, począwszy od programu Visual Studio 2015:
/LTCG:
{PGINSTRUMENT
||PGOPTIMIZE
PGUPDATE
}
Argumenty
INCREMENTAL
(Opcjonalnie) Określa, że konsolidator stosuje tylko optymalizację całego programu lub generowanie kodu czasu łącza (LTCG) do plików, których dotyczy edycja, zamiast całego projektu. Domyślnie ta flaga nie jest ustawiana, gdy /LTCG
jest określona, a cały projekt jest połączony przy użyciu optymalizacji całego programu.
NOSTATUS
| STATUS
(Opcjonalnie) Określa, czy konsolidator wyświetla wskaźnik postępu, który pokazuje procent ukończenia łącza. Domyślnie te informacje o stanie nie są wyświetlane.
OFF
(Opcjonalnie) Wyłącza generowanie kodu w czasie połączenia. Konsolidator traktuje wszystkie moduły skompilowane z /GL
tak, jakby zostały skompilowane bez tej opcji, a wszystkie moduły MSIL powodują niepowodzenie łącza.
PGINSTRUMENT
(Opcjonalnie) Ta opcja jest przestarzała, począwszy od programu Visual Studio 2015. Zamiast tego użyj instrukcji /LTCG
i /GENPROFILE
lub /FASTGENPROFILE
wygeneruj instrumentowaną kompilację na potrzeby optymalizacji sterowanej profilem. Dane zbierane z instrumentowanych przebiegów służą do tworzenia zoptymalizowanego obrazu. Aby uzyskać więcej informacji, zobacz Profile-Guided Optimizations (Optymalizacje sterowane profilem). Krótka forma tej opcji to /LTCG:PGI
.
PGOPTIMIZE
(Opcjonalnie) Ta opcja jest przestarzała, począwszy od programu Visual Studio 2015. Zamiast tego użyj polecenia /LTCG
i /USEPROFILE
, aby utworzyć zoptymalizowany obraz. Aby uzyskać więcej informacji, zobacz Profile-Guided Optimizations (Optymalizacje sterowane profilem). Krótka forma tej opcji to /LTCG:PGO
.
PGUPDATE
(Opcjonalnie) Ta opcja jest przestarzała, począwszy od programu Visual Studio 2015. Zamiast tego użyj polecenia /LTCG
i /USEPROFILE
, aby ponownie skompilować zoptymalizowany obraz. Aby uzyskać więcej informacji, zobacz Profile-Guided Optimizations (Optymalizacje sterowane profilem). Krótka forma tej opcji to /LTCG:PGU
.
Uwagi
Opcja /LTCG
informuje konsolidatora o wywołaniu kompilatora i wykonaniu optymalizacji całego programu. Możesz również przeprowadzić optymalizację z przewodnikiem profilów. Aby uzyskać więcej informacji, zobacz Profile-Guided Optimizations (Optymalizacje sterowane profilem).
Z następującymi wyjątkami nie można dodać opcji konsolidatora do kombinacji /LTCG
PGO i /USEPROFILE
które nie zostały określone w poprzedniej kombinacji inicjowania /LTCG
PGO i /GENPROFILE
opcji:
Wszelkie opcje konsolidatora określone razem z opcjami /LTCG
i /GENPROFILE
inicjowania PGO nie muszą być określone podczas kompilowania przy użyciu i /LTCG
/USEPROFILE
; są one dorozumiane.
W pozostałej części tego artykułu omówiono generowanie kodu w czasie połączenia przez /LTCG
program .
/LTCG
jest implikowane za pomocą polecenia /GL
.
Konsolidator wywołuje generowanie kodu czasu łącza, jeśli został przekazany moduł, który został skompilowany przy użyciu /GL
lub moduł MSIL (zobacz .netmodule
Pliki jako dane wejściowe konsolidatora). Jeśli nie określisz /LTCG
jawnie, kiedy przekazujesz /GL
lub moduły MSIL do konsolidatora, konsolidator w końcu wykryje tę sytuację i ponownie uruchomi link przy użyciu polecenia /LTCG
. Jawnie określ /LTCG
, kiedy przekazujesz /GL
moduły MSIL do konsolidatora, aby uzyskać najszybszą możliwą wydajność kompilacji.
Aby uzyskać jeszcze większą wydajność, użyj polecenia /LTCG:INCREMENTAL
. Ta opcja nakazuje konsolidatorowi zmianę tylko plików, na które ma wpływ zmiana pliku źródłowego, zamiast całego projektu. Ta opcja może znacznie skrócić wymagany czas połączenia. Ta opcja nie jest tą samą opcją co łączenie przyrostowe. Jeśli usuniesz /LTCG:INCREMENTAL
tę opcję, usuń również dowolną /LTCGOUT
opcję, aby poprawić czas kompilacji i wykorzystanie dysku.
/LTCG
nie jest prawidłowy do użycia z /INCREMENTAL
programem .
Gdy /LTCG
jest używany do łączenia modułów skompilowanych przy użyciu metod /Og
, /O1
, /O2
lub /Ox
, są wykonywane następujące optymalizacje:
Inlinowanie między modułami
Alokacja międzyproceduralna rejestru (tylko systemy operacyjne 64-bitowe)
Niestandardowa konwencja wywoływania (tylko x86)
Małe przemieszczanie protokołu TLS (tylko x86)
Wyrównanie podwójne stosu (tylko x86)
Ulepszona uściślanie pamięci (lepsze informacje o interferencji dla zmiennych globalnych i parametrów wejściowych)
Uwaga
Konsolidator określa, które optymalizacje zostały użyte do skompilowania każdej funkcji i stosuje te same optymalizacje w czasie łączenia.
Użycie funkcji /LTCG
i /O2
powoduje optymalizację podwójnej wyrównania.
Jeśli /LTCG
określono i /O1
są określone, podwójne wyrównanie nie jest wykonywane. Jeśli większość funkcji w aplikacji jest kompilowana pod kątem szybkości, z kilkoma funkcjami skompilowanymi pod kątem rozmiaru (na przykład przy użyciu optimize
pragma), kompilator dwukrotnie wyrównuje funkcje zoptymalizowane pod kątem rozmiaru, jeśli wywołają funkcje wymagające podwójnego wyrównania.
Jeśli kompilator może zidentyfikować wszystkie lokacje wywołań funkcji, kompilator ignoruje jawne modyfikatory konwencji wywoływania i próbuje zoptymalizować konwencję wywoływania funkcji:
przekazywanie parametrów w rejestrach
zmiana kolejności parametrów w celu wyrównania
usuwanie nieużywanych parametrów
Jeśli funkcja jest wywoływana za pomocą wskaźnika funkcji lub jeśli funkcja jest wywoływana spoza modułu kompilowanego przy użyciu /GL
metody , kompilator nie próbuje zoptymalizować konwencji wywoływania funkcji.
Uwaga
Jeśli używasz /LTCG
i ponownie definiujesz mainCRTStartup
metodę , aplikacja może mieć nieprzewidywalne zachowanie, które odnosi się do kodu użytkownika wykonywanego przed zainicjowaniem obiektów globalnych. Istnieją trzy sposoby rozwiązania tego problemu: nie należy ponownie definiować mainCRTStartup
pliku , nie kompiluj pliku zawierającego mainCRTStartup
przy użyciu metody /LTCG
lub inicjuj zmienne globalne i obiekty statycznie.
/LTCG
i moduły MSIL
Moduły kompilowane przy użyciu polecenia /GL
i /clr
mogą być używane jako dane wejściowe konsolidatora, gdy /LTCG
jest określony.
/LTCG
może akceptować pliki obiektów natywnych i mieszane pliki obiektów natywnych/zarządzanych (skompilowane przy użyciu polecenia/clr
). Opcje/clr:pure
i/clr:safe
kompilatora są przestarzałe w programie Visual Studio 2015 i nieobsługiwane w programie Visual Studio 2017 lub nowszym./LTCG:PGI
nie akceptuje modułów natywnych skompilowanych przy użyciu elementów/GL
i/clr
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Właściwość Whole Program Optimization ustawia kilka opcji kompilatora i konsolidatora, w tym /LTCG
. Zalecamy użycie tej właściwości w celu zmiany ustawień całej konfiguracji kompilacji. Aby ustawić optymalizację całego programu dla projektu:
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać więcej informacji, zobacz Ustawianie właściwości kompilatora i kompilacji.
Wybierz stronę Właściwości> ogólne konfiguracji.
Zmodyfikuj właściwość Optymalizacja całego programu. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.
Możesz również zastosować do /LTCG
określonych kompilacji, wybierając pozycję Kompilacja>optymalizacja z przewodnikiem profilu na pasku menu lub wybierając jedną z opcji Optymalizacja z przewodnikiem profilu w menu skrótów dla projektu.
Aby włączyć oddzielnie generowanie kodu czasu połączenia lub ustawić określoną opcję generowania kodu czasu łącza:
Otwórz okno dialogowe Strony właściwości projektu.
Wybierz stronę właściwości Optymalizacji konsolidatora właściwości>konsolidatora> konfiguracji.
Zmodyfikuj właściwość Generowanie kodu czasu łącza do jednej z następujących opcji:
- Wartość domyślna
- Używanie generowania kodu czasu szybkiego łącza (LTCG:przyrostowe)
- Używanie generowania kodu czasu połączenia (LTCG)
- Optymalizacja z przewodnikiem profilu — instrument (LTCG:PGInstrument)
- Optymalizacja z przewodnikiem profilu — optymalizacja (LTCG:PGOptimize)
- Optymalizacja z przewodnikiem profilu — aktualizacja (LTCG:PGUpdate)
Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.
Aby określić, czy konsolidator wyświetla wskaźnik postępu generowania kodu czasu łącza:
Otwórz okno dialogowe Strony właściwości projektu.
Wybierz stronę właściwości Ogólne konsolidatora>właściwości>konfiguracji.
Zmodyfikuj właściwość Stan łącza. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.
Aby programowo ustawić tę opcję kompilatora
- Zobacz: LinkTimeCodeGeneration.