Profilalapú optimalizálás

A profilalapú optimalizálás (PGO) lehetővé teszi egy teljes végrehajtható fájl optimalizálását. 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.

Megjegyzés:

Az SPGO (mintaprofil-vezérelt optimalizálás) egy olyan alternatív megközelítés, amely az instrumentálás helyett a Windows hardveres CPU-teljesítményszámlálóit használja. Az SPGO nem igényel instrumentált buildet – egy meglévő kiadási binárist a xperf használatával profilozhat. További információkért lásd: A mintaprofil-vezérelt optimalizálás bemutatása az MSVC-ben és A mintaprofil-vezérelt optimalizálás (SPGO) oktatóanyag.

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épnek é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 fordító megvizsgálja a /GL-vel készült modulokat a profilvezérelt optimalizálási tesztfuttatások során a futásidejű viselkedés rögzítéséhez. Nem kell minden modult lefordítania egy profilvezérelt optimalizálási buildben a /GL használatával. Azonban csak a /GL kapcsolóval lefordított modulok lesznek instrumentálva, és csak ezek lesznek később elérhetők profilvezérelt optimalizálásokhoz.

  • Használja a /LTCG és a /GENPROFILE vagy /FASTGENPROFILE kapcsolót a hivatkozáshoz.

    Ha a /LTCG és a /GENPROFILE vagy a /FASTGENPROFILE beállításokat együtt használja, az instrumentált alkalmazás futásakor létrehoz egy .pgd fájlt. Miután hozzáadta a tesztalapú adatokat a .pgd fájlhoz, használhatja azt a következő hivatkozási lépés bemeneteként (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 megadásához .pgd . 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.

    A folyamat minden alkalommal, amikor egy profilozott EXE-munkamenet véget ér, vagy egy profilozott DLL-fájl ki van ürítve, a folyamat létrehoz egy appname!N.pgc fájlt. 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 1-től kezdődő szám. A könyvtá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.

  • Hivatkozás az /LTCG és a /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 veszi fel a .pgd fájlt. A /USEPROFILE 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. Ezt a nevet az elavult /PGD linker beállítással is megadhatja. Az /LTCG és a /USEPROFILE linker beállításainak kombinációja felváltja 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 profilkészítés hasznosabb lenne egy optimalizáltabb rendszerkép létrehozásához. Ha a műszerezett lemezkép és a hozzá tartozó .pgd fájl elérhető, további tesztfuttatásokat végezhet, és az optimalizált lemezképet újraépítheti az újabb .pgd fájl használatával, ugyanazokkal a /LTCG és /USEPROFILE linkelőbeállításokkal.

Megjegyzés:

Mindkettő .pgc és .pgd a fájlok bináris fájltípusok. Ha egy forrásvezérlő rendszerben tárolja őket, 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 foglalja magában:

  • Inlining – Ha például az A függvény gyakran hívja a B függvényt, és a B függvény viszonylag kicsi, akkor a profilvezérelt optimalizálások beágyazzák a B függvényt az A függvénybe.

  • 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. Ugyanez az optimalizálás elvégezhető if...else utasításokkal is, ahol az optimalizáló úgy rendezheti el a if...else szerkezetet, hogy a if vagy a else blokk kerüljön előre, attól függően, hogy melyik blokk feltétele teljesül gyakrabban.

  • Holtkód elkülönítése – A profilvezérelt optimalizálás a profilozás során nem hívott kódot a szakaszkészlet végén található speciális szakaszba helyezi át. 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. A profilalapú optimalizálások akkor helyezik át, amikor megállapítják, hogy a kivételek csak kivételes körülmények között fordulnak elő.

  • Memóriaintrinsic függvények – Az, hogy kibővítik-e az intrinsic függvényt, attól függ, hogy gyakran hívják-e. Az intrinzikus függvény az áthelyezések vagy másolatok blokkmérete alapján is optimalizálható.

Következő lépések

A profilalapú optimalizálásban használható környezeti változókkal, függvényekkel és eszközökkel kapcsolatos további információkért tekintse meg a következő erőforrásokat:

Környezeti változók profilvezérelt optimalizáláshoz
Ezek a változók határozzák meg a tesztelési forgatókönyvek futásidejű viselkedését. 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.

Példa a profilvezérelt optimalizálás (SPGO) útmutatójához
Az instrumentáció helyett használja a CPU hardveres teljesítményszámlálóit. Nincs szükség instrumentált buildre – profilozza a meglévő kiadási binárist a(z) xperf használatával.

Lásd még

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