Profilalapú optimalizálás

A profilalapú optimalizálás (PGO) lehetővé teszi egy teljes végrehajtható fájl optimalizálását, ahol az optimalizáló a .exe vagy .dll fájl tesztfuttatásaiból származó adatokat használja. Az adatok a program éles környezetben való valószínű teljesítményét mutatják.

Profilvezérelt optimalizálás csak x86, x64 vagy ARM64 natív célokhoz érhető el. A profilalapú optimalizálások nem érhetők el a közös nyelvi futtatókörnyezetben futó végrehajtható fájlokhoz. Még akkor is, ha vegyes natív és felügyelt kódot tartalmazó szerelvényt készít (a /clr fordítóval), akkor sem használhat profilalapú optimalizálást csak a natív kódra vonatkozóan. Ha az IDE-ben megadott beállításokkal próbál projektet létrehozni, buildelési hiba fog létrejönni.

Megjegyzés:

A profilkészítési tesztből összegyűjtött információk felülbírálják azokat az optimalizálásokat, amelyek egyébként az /Ob, /Os vagy /Ot megadásakor lépnének érvénybe. További információ: /Ob (Beágyazott függvénybővítés) és /Os, /Ot (Kis kód előnyben részesítése, Gyors kód előnyben részesítése).

Az alkalmazás optimalizálásának lépései

A profilalapú optimalizálás használatához kövesse az alábbi lépéseket az alkalmazás optimalizálásához:

  • Állítson össze egy vagy több forráskódfájlt a /GL használatával.

    A /GL-vel készült minden modul megvizsgálható a profilvezérelt optimalizálási tesztfuttatások során a futásidejű viselkedés rögzítéséhez. A profilalapú optimalizálási buildek minden modulját nem kell a /GL használatával lefordítani. A profilalapú optimalizáláshoz azonban csak a /GL-vel lefordított modulok vannak kialakítva, és később érhetők el.

  • Kapcsolás /LTCG és /GENPROFILE vagy /FASTGENPROFILE használatával.

    Az /LTCG és a /GENPROFILE vagy a /FASTGENPROFILE együttes használata egy .pgd fájlt hoz létre a műszerezett alkalmazás futtatásakor. Miután hozzáadta a tesztfuttatási adatokat a .pgd fájlhoz, a következő hivatkozási lépés bemeneteként használható (az optimalizált rendszerkép létrehozása). A /GENPROFILE megadásakor opcionálisan hozzáadhat egy PGD=fájlnév argumentumot a fájl nem hibás nevének vagy helyének .pgd megadásához. Az /LTCG és a /GENPROFILE vagy a /FASTGENPROFILE linker kapcsoló kombinációja lecseréli az elavult /LTCG:PGINSTRUMENT linker kapcsolót.

  • Profilozza az alkalmazást.

    Minden alkalommal, amikor egy profilozott EXE-munkamenet véget ér, vagy egy profilozott DLL-t töröl, létrejön egy appname!N.pgc fájl. A .pgc fájlok egy adott alkalmazásteszt futtatásával kapcsolatos információkat tartalmaznak. az alkalmazásnév az alkalmazás neve, az N pedig egy szám, amely 1-zel kezdődik, amely a címtárban lévő többi appname!N.pgc fájl száma alapján növekszik. Törölheti a fájlokat .pgc , ha a tesztfuttatás nem az optimalizálni kívánt forgatókönyvet jelöli.

    A tesztfuttatás során kényszerítheti az aktuálisan megnyitott .pgc fájl bezárását és egy új .pgc fájl létrehozását a pgosweep segédprogrammal (például ha egy tesztforgatókönyv vége nem esik egybe az alkalmazás leállításával).

    Az alkalmazás közvetlenül meghívhat egy PGO-függvényt, a PgoAutoSweep-et is, hogy fájlként .pgc rögzítse a hívás helyén lévő profiladatokat. Jobban ellenőrizheti a .pgc fájlokban rögzített adatok által lefedett kódot. A függvény használatára vonatkozó példa a PgoAutoSweep dokumentációjában található.

    Amikor létrehozod az instrumentált buildet, alapértelmezés szerint az adatgyűjtés szálbiztosítás nélküli módban történik, ami gyorsabb, de kevésbé pontos lehet. Az EXACTargumentumot a /GENPROFILE vagy a /FASTGENPROFILE értékre használva megadhatja az adatgyűjtést szálmentes módban, ami pontosabb, de lassabb. Ez a lehetőség akkor is elérhető, ha beállítja az elavult PogoSafeMode környezeti változót vagy az elavult /POGOSAFEMODE linker kapcsolót a rendszerezett build létrehozásakor.

  • Kapcsold össze a /LTCG és /USEPROFILE használatával.

    Az optimalizált rendszerkép létrehozásához használja az /LTCG és a /USEPROFILE linker beállításait is. Ez a lépés bemenetként használja a .pgd fájlt. A /USEPROFILE megadásakor opcionálisan hozzáadhat egy PGD=fájlnév argumentumot a fájl nem alapértelmezett nevének vagy helyének megadásához .pgd . Ezt a nevet az elavult /PGD linker beállítással is megadhatja. Az /LTCG és a /USEPROFILE kombinációja lecseréli az elavult /LTCG:PGOPTIMIZE és /LTCG:PGUPDATE linker beállításokat.

Még az optimalizált végrehajtható fájlt is létrehozhatja, és később megállapíthatja, hogy a további profilkészítés hasznos lenne egy optimalizáltabb rendszerkép létrehozásához. Ha a rendszerkép és a .pgd fájl elérhető, további tesztfuttatásokat hajthat végre, és újraépítheti az optimalizált rendszerképet az újabb .pgd fájllal ugyanazokkal az /LTCG és /USEPROFILE linker beállításokkal.

Megjegyzés:

Mindkettő .pgc és .pgd a fájlok bináris fájltípusok. Ha forrásvezérlő rendszerben tárolja, kerülje a szövegfájlok automatikus átalakítását.

A PGO által végzett optimalizálás

A profilalapú optimalizálás az alábbi ellenőrzéseket és fejlesztéseket tartalmazza:

  • Inlining – Például, ha egy A függvény gyakran hív meg egy B függvényt, és a B függvény viszonylag kicsi, akkor a profilvezérelt optimalizálás a B függvényt az A függvénybe inline-olja.

  • Virtuális hívás spekulációja – Ha egy virtuális hívás vagy egy függvénymutatón keresztüli egyéb hívás gyakran egy adott függvényt céloz meg, a profilalapú optimalizálás feltételesen végrehajtott közvetlen hívást szúrhat be a gyakran megcélzott függvényhez, és a közvetlen hívás beágyazott lehet.

  • Regiszter allokáció – A profiladatokon alapuló optimalizálás jobb regiszter-kiosztást eredményez.

  • Alapszintű blokkoptimalizálás – Az alapszintű blokkoptimalizálás lehetővé teszi, hogy az adott kereten belül időlegesen végrehajtott, gyakran végrehajtott alapblokkok ugyanabban a lapkészletben (helységben) legyenek elhelyezve. Csökkenti a használt lapok számát, ami minimálisra csökkenti a memóriaterhelést.

  • Méret-/sebességoptimalizálás – Azokat a függvényeket, amelyekben a program a legtöbb végrehajtási időt tölti, a sebességre optimalizálható.

  • Függvényelrendezés – A hívási gráf és a profilozott hívó/hívó viselkedése alapján az azonos végrehajtási útvonalon lévő függvények ugyanabba a szakaszba kerülnek.

  • Feltételes elágaztatás optimalizálása – Az értékminták segítségével a profilalapú optimalizálások megállapíthatják, hogy egy kapcsolóutasítás adott értékét gyakrabban használják-e, mint más értékeket. Ez az érték ezután kihúzható a kapcsolóutasításból. A if...else utasításokkal ugyanez elérhető, ahol az optimalizáló képes úgy rendezni a if...else parancsokat, hogy az első helyre az a blokk (if vagy else) kerüljön, amelyik gyakrabban igaz.

  • Holt kód elkülönítése – A profilozás során nem hívott kód egy speciális szakaszba kerül, amely a szakaszok halmazának végéhez van hozzáfűzve. Hatékonyan távol tartja ezt a szakaszt a gyakran használt lapoktól.

  • EH-kód elkülönítése – Mivel az EH-kód csak kivételesen van végrehajtva, gyakran áthelyezhető egy külön szakaszba. Amikor a profilalapú optimalizálások meg tudják állapítani, hogy a kivételek csak kivételes körülmények között fordulnak elő, akkor kerül áthelyezésre.

  • Memória-intrinzék – Az intrinzék kibontása attól függ, hogy gyakran hívják-e őket. Az intrinzikus függvény az áthelyezések vagy másolatok blokkmérete alapján is optimalizálható.

Következő lépések

További információ a profilalapú optimalizálásban használható környezeti változókról, függvényekről és eszközökről:

Környezeti változók profilvezérelt optimalizáláshoz
Ezek a változók a tesztelési forgatókönyvek futásidejű viselkedésének megadására szolgáltak. Most már elavultak, és új hivatkozási lehetőségek váltják fel őket. Ez a dokumentum bemutatja, hogyan válthat a környezeti változókról a hivatkozási beállításokra.

PgoAutoSweep
Az alkalmazásához hozzáadható egy olyan függvény, amely finomhangolt fájladat rögzítési vezérlést biztosít.

pgosweep
Egy parancssori segédprogram, amely az összes profiladatot a .pgc fájlba írja, bezárja a .pgc fájlt, és megnyitja az új .pgc fájlt.

pgomgr
Egy parancssori segédprogram, amely profiladatokat ad hozzá egy vagy több .pgc fájlból a .pgd fájlhoz.

Útmutató: Több PGO-profil egyesítése egyetlen profilba
Példák a pgomgr használatára.

Lásd még

További MSVC buildelési eszközök