Profilstyrd optimering
Profilstyrd optimering ( PGO , ibland uttalad som pogo ), även känd som profilstyrd feedback ( PDF ), och feedback-riktad optimering ( FDO ) är en kompilatoroptimeringsteknik inom datorprogrammering som använder profilering för att förbättra programmets körtidsprestanda .
Metod
Optimeringstekniker baserade på statisk programanalys av källkoden överväger kodprestandaförbättringar utan att faktiskt köra programmet. Ingen dynamisk programanalys utförs. Analysen kan till och med överväga kod inom loopar inklusive antalet gånger som loopen kommer att exekveras, till exempel vid loop-unrolling . I avsaknad av all körtidsinformation kan statisk programanalys inte ta hänsyn till hur ofta den koddelen faktiskt exekveras.
Den första kompilatorn på hög nivå, introducerad som Fortran Automatic Coding System 1957, bröt koden i block och skapade en tabell över frekvensen varje block exekveras via en simulerad exekvering av koden på ett Monte Carlo- sätt där resultatet av villkorliga överföringar (som via IF
-typ-satser) bestäms av en slumptalsgenerator som är lämpligt viktad av vilka FREQUENCY
-satser som än tillhandahålls av programmeraren.
I stället för frekvensinformation som tillhandahålls av programmeraren använder profilstyrd optimering resultaten av profileringstestkörningar av det instrumenterade programmet för att optimera den slutgiltiga genererade koden . Kompilatorn kommer åt profildata från en provkörning av programmet över en representativ ingångsuppsättning. Resultaten indikerar vilka områden i programmet som körs oftare och vilka områden som körs mer sällan. Alla optimeringar drar nytta av profilstyrd feedback eftersom de är mindre beroende av heuristik när de fattar kompileringsbeslut. Förbehållet är dock att urvalet av data som matas till programmet under profileringsstadiet måste vara statistiskt representativt för de typiska användningsscenarierna; annars har profilstyrd feedback potential att skada den övergripande prestandan för det slutliga bygget istället för att förbättra det.
Just-in-time kompilering kan använda körtidsinformation för att dynamiskt kompilera om delar av den exekverade koden för att generera en mer effektiv inbyggd kod. Om den dynamiska profilen ändras under körning kan den deoptimera den tidigare inbyggda koden och generera en ny kod optimerad med informationen från den nya profilen.
Adoption
Det finns stöd för att bygga Firefox med PGO. Även om PGO är effektivt, har det inte använts i stor utsträckning av programvaruprojekt, på grund av dess tråkiga dubbelkompileringsmodell. Det är också möjligt att utföra PGO utan instrumentering genom att samla in en profil med hjälp av maskinvaruprestandaräknare . Detta provtagningsbaserade tillvägagångssätt har mycket lägre omkostnader och kräver ingen speciell sammanställning.
HotSpot Java Virtual Machine (JVM ) använder profilstyrd optimering för att dynamiskt generera inbyggd kod. Som en konsekvens är en mjukvarubinär optimerad för den faktiska belastningen den tar emot. Om belastningen ändras kan adaptiv optimering dynamiskt kompilera om den körande programvaran för att optimera den för den nya belastningen. Detta innebär att all mjukvara som körs på HotSpot JVM effektivt använder sig av profilstyrd optimering.
PGO har antagits i Microsoft Windows -versionen av Google Chrome . PGO aktiverades i 64-bitarsversionen av Chrome från och med version 53 och version 54 för 32-bitarsversionen .
Google publicerade en artikel som beskrev ett system (AutoFDO) som används för att använda produktionsprofiler för att vägleda byggen, vilket resulterar i en prestandaförbättring på upp till 10 %.
Genomföranden
Exempel på kompilatorer som implementerar PGO är:
- Intel C++-kompilator och Fortran -kompilatorer
- GNU Compiler Collection kompilatorer
- Oracle Solaris Studio (tidigare kallad Sun Studio)
- Microsoft Visual C++ kompilator
- Klang
- IBM XL C/C++
- GraalVM Enterprise Edition
- .NET JIT-kompilator
Se även
- Adaptiv optimering
- Dynamisk eliminering av död kod
- Global optimering
- Hot spot (datorprogrammering)
-
Interprocedurell optimering
- Länktidsoptimering (LTO)
- Spåra just-in-time sammanställning