Profilstyrd optimering
Profilstyrd optimering ( PGO ) - en teknik för att optimera ett program av en kompilator, som syftar till att öka programmets prestanda. Till skillnad från traditionella optimeringsmetoder som endast analyserar källkoder, använder PGO resultaten av mätningar av testkörningar av programmet som optimeras för att generera mer optimal kod. Testkörningar visar vilka delar av programmet som körs oftare och vilka mer sällan. Fördelen med detta tillvägagångssätt är att kompilatorn inte gör antaganden när han väljer en optimeringsmetod, utan använder verklig statistik som samlas in under programexekveringen. Man bör ta hänsyn till att testkörningar av programmet måste utföras enligt det mest typiska scenariot för att statistiken ska vara representativ, annars kan programmets prestanda till och med försämras.
Optimeringsmetoder
Bland de optimeringar som kan använda statistik som samlats in med PGO [1] :
- Inlining - till exempel, om funktion A ofta anropar funktion B, och funktion B är tillräckligt liten, så infogas funktion B i A. Detta görs baserat på verklig statistik över programstarter.
- Virtuell anropsspekulation – om ett virtuellt anrop eller ett anrop via en pekfunktion ofta pekar på en specifik funktion, så kan den ersättas med ett villkorligt direkt (utlöst när villkoret är uppfyllt) anrop till en specifik funktion, och funktionen kan t.o.m. byggas in (inline).
- Registertilldelning - optimering av registertilldelning baserat på insamlad data.
- Grundläggande blockoptimering - Denna optimering tillåter att så kallade kodblock placeras på en gemensam minnessida, vilket minimerar sidanvändning och minneskostnader.
- Storleks-/hastighetsoptimering - Funktioner där programmet tillbringar en betydande tid kan optimeras för exekveringshastighet.
- Funktionslayout - baserat på anropsdiagrammet kommer funktioner som tillhör samma exekveringskedja att placeras i samma sektion.
- Conditional Branch Optimization - optimering av förgrenings- och switchuttryck. Baserat på testkörningar hjälper PGO dig att avgöra vilka villkor i en switch-sats som exekveras oftare än andra. Dessa värden kan sedan tas ut från switch-satsen. Detsamma gäller if/else: kompilatorn kan beställa grenarna baserat på att veta vilken som anropas oftare.
- Dead Code Separation - kod som inte anropades under testkörningar kan flyttas till en speciell sektion för att förhindra att den hamnar på ofta använda minnessidor.
- EH-kodseparation - undantagshanteringskod som exekveras i undantagsfall kan flyttas till en separat sektion om det är möjligt att fastställa att undantag utlöses under specifikt definierade förhållanden.
- Memory Intrinsics - Minnesfunktioner som memset, memcpy och andra kan byggas in eller optimeras för de vanligaste blockstorlekarna.
Implementeringar
PGO-optimeringstekniker implementeras, särskilt av kompilatorer:
Anteckningar
- ↑ Profilstyrda optimeringar . Hämtad 15 februari 2012. Arkiverad från originalet 22 februari 2012. (obestämd)
- ↑ Clang Compiler User's Manual - Clang 3.9 dokumentation . clang.llvm.org. Hämtad 6 maj 2016. Arkiverad från originalet 15 september 2011. (obestämd)