Profiiliohjattu optimointi

Profiiliohjattu optimointi (engl. profile-guided optimization, PGO, tai engl. feedback-directed optimization, FDO) tarkoittaa tietotekniikassa ohjelmointikielen kääntäjän tekniikkaa, jossa ohjelman optimointiin käytetään tietoa (profiilia) ohjelman aiemmasta suorituksesta. Kääntäjälle annetaan aiemmasta suorituksesta tietoa, jolloin se voi uuden käännöksen yhteydessä tehdä vastaavasti ohjelman suoritukseen sopivia optimointeja. Esimerkiksi kääntäjä voi aggressiivisemmin korvata funktiokutsut ohjelman rungolla (inline).[1] Profiilin avulla voi saada merkittävästi paremman tuloksen SPEC2000-suorituskykytestissä, mutta haittapuolena on ohjelman kääntäminen kahdesti, joka suurissa projekteissa vie merkittävän paljon aikaa.[2] Profiiliohjattua optimointia ei myöskään ole mahdollista käyttää kaikissa tilanteissa.[3]

Profiiliohjatussa optimoinnissa harvoin suoritettu ohjelmakoodi kuten virheet ja rajatapaukset saavat vähemmän painoarvoa ohjelma kriittisellä suorituspolulla. Ohjelmoija voi myös itse käyttää haarautumisen vihjeitä kuten C++20 avainsanoja [[likely]] ja [[unlikely]], tai inline avainsanaa. Tällöin kääntäjä voi tehdä oletuksia yleisemmin suoritetusta polusta.[4]

Profiilin luomiseen ohjelma käännetään instrumentoidussa moodissa, jolloin siihen on lisätty koodilohkojen alkuun koodia suorituksen seuraamiseen. Lopuksi ohjelman on tallennettava suoritustiedot jatkokäyttöä varten. Profiiliohjattu optimointi on tarkoitettu kehityksen viimeiseen vaiheeseen ja muilla keinoilla voi saada merkittävämpiä tuloksia kuten algoritmien ja tietorakenteiden optimoinnilla.[4]

Katso myös muokkaa

Lähteet muokkaa

  1. Profile-guided optimization go.dev. Viitattu 5.12.2023. (englanniksi)
  2. Taming Hardware Event Samples for FDO Compilation (PDF) static.googleusercontent.com. Viitattu 5.12.2023. (englanniksi)
  3. Profile-guided optimizations learn.microsoft.com. 18.10.2022. Viitattu 5.12.2023. (englanniksi)
  4. a b How Profile-Guided Optimization (PGO) works developer.android.com. Viitattu 5.12.2023. (englanniksi)