Profilvezérelt optimalizálás
Profilvezérelt optimalizálás ( PGO ) – a program fordító általi optimalizálására szolgáló technika, melynek célja a program teljesítményének növelése. A hagyományos optimalizálási módszerekkel ellentétben, amelyek csak a forráskódokat elemzik, a PGO az optimalizált program tesztfutásainak mérési eredményeit használja fel az optimálisabb kód generálására. A tesztfutások során kiderül, hogy a program mely részei futnak le gyakrabban és melyek ritkábban. Ennek a megközelítésnek az az előnye, hogy a fordító nem feltételez feltételezéseket az optimalizálási módszer kiválasztásakor, hanem a program végrehajtása során gyűjtött valós statisztikákat használja fel. Figyelembe kell venni, hogy a program tesztfutásait a legjellemzőbb forgatókönyv szerint kell végrehajtani ahhoz, hogy a statisztika reprezentatív legyen, ellenkező esetben a program teljesítménye akár romolhat is.
Optimalizálási módszerek
Azok az optimalizálások, amelyek a PGO-val gyűjtött statisztikákat használhatják [1] :
- Inlining – például, ha az A függvény gyakran hívja a B függvényt, és a B függvény elég kicsi, akkor B függvény be van illesztve A-ba. Ez a programindítások valós statisztikái alapján történik.
- Virtuális hívásspekuláció - ha egy virtuális hívás vagy egy mutatófüggvényen keresztüli hívás gyakran egy adott függvényre mutat, akkor az helyettesíthető egy feltételesen közvetlen (a feltétel teljesülése esetén kiváltott) hívással egy adott függvényre, és a függvény akár be kell építeni (inline).
- Regiszterkiosztás - a nyilvántartások kiosztásának optimalizálása az összegyűjtött adatok alapján.
- Alapvető blokkoptimalizálás – Ez az optimalizálás lehetővé teszi úgynevezett kódblokkok elhelyezését egy közös memóriaoldalon, ami minimalizálja az oldalhasználatot és a memória többletköltségét.
- Méret/sebesség optimalizálása – Azok a funkciók, amelyekben a program jelentős időt tölt, a végrehajtási sebességre optimalizálhatók.
- Funkcióelrendezés - a hívási gráf alapján az azonos végrehajtási lánchoz tartozó függvények ugyanabba a szekcióba kerülnek.
- Feltételes elágazás optimalizálás - elágazási és kapcsoló kifejezések optimalizálása. A tesztfutások alapján a PGO segít meghatározni, hogy egy switch utasítás mely feltételei hajtódnak végre gyakrabban, mint mások. Ezek az értékek ezután kivehetők a switch utasításból. Ugyanez vonatkozik az if/else-re is: a fordító az elágazásokat az alapján rendelheti meg, hogy tudja, melyiket hívják gyakrabban.
- Dead Code Separation – a tesztfutások során nem hívott kód egy speciális szakaszba helyezhető át, hogy ne kerüljön a gyakran használt memóriaoldalakra.
- EH Code Separation - a kivételes esetekben végrehajtott kivételkezelő kód egy külön szakaszba helyezhető át, ha megállapítható, hogy a kivételek konkrétan meghatározott feltételek mellett aktiválódnak.
- Memória jellemzői – Az olyan memóriafunkciók, mint a memset, memcpy és mások, beépíthetők vagy optimalizálhatók a leggyakoribb blokkméretekhez.
Megvalósítások
A PGO optimalizálási technikákat különösen a fordítók valósítják meg:
Jegyzetek
- ↑ Profilvezérelt optimalizálás . Letöltve: 2012. február 15. Az eredetiből archiválva : 2012. február 22.. (határozatlan)
- ↑ Clang Compiler felhasználói kézikönyv - Clang 3.9 dokumentáció . clang.llvm.org. Letöltve: 2016. május 6. Az eredetiből archiválva : 2011. szeptember 15. (határozatlan)