Optimizare ghidată de profil
Optimizare ghidată de profil ( PGO ) - o tehnică de optimizare a unui program de către un compilator, care vizează creșterea performanței programului. Spre deosebire de metodele tradiționale de optimizare care analizează doar codurile sursă, PGO utilizează rezultatele măsurătorilor testelor programului fiind optimizat pentru a genera un cod mai optim. Testele dezvăluie care părți ale programului sunt executate mai des și care mai rar. Avantajul acestei abordări este că compilatorul nu face ipoteze atunci când alege o metodă de optimizare, ci folosește statistici reale colectate în timpul execuției programului. Trebuie avut în vedere faptul că rulările de testare ale programului trebuie efectuate conform celui mai tipic scenariu pentru ca statisticile să fie reprezentative, altfel performanța programului se poate deteriora chiar.
Metode de optimizare
Printre optimizările care pot folosi statisticile colectate cu PGO [1] :
- Inline - de exemplu, dacă funcția A apelează adesea funcția B, iar funcția B este suficient de mică, atunci funcția B este aliniată în A. Acest lucru se face pe baza statisticilor reale ale lansărilor de program.
- Speculația apelului virtual - dacă un apel virtual sau un apel printr-o funcție pointer indică adesea o anumită funcție, atunci poate fi înlocuit cu un apel direct condiționat (declanșat atunci când condiția este îndeplinită) către o anumită funcție, iar funcția poate chiar fi încorporat (inline).
- Register Allocation - optimizarea alocării registrelor pe baza datelor colectate.
- Optimizarea de bază a blocurilor - Această optimizare permite plasarea blocurilor de cod co-numite pe o pagină de memorie comună, ceea ce reduce la minimum utilizarea paginii și supraîncărcarea memoriei.
- Optimizare dimensiune/viteză - Funcțiile în care programul petrece o cantitate semnificativă de timp pot fi optimizate pentru viteza de execuție.
- Function Layout - pe baza graficului de apel , funcțiile aparținând aceluiași lanț de execuție vor fi plasate în aceeași secțiune.
- Optimizarea condițională a ramurilor - optimizarea expresiilor de ramificare și comutare. Pe baza testelor, PGO vă ajută să determinați care condiții dintr-o instrucțiune switch sunt executate mai des decât altele. Aceste valori pot fi apoi scoase din declarația switch. Același lucru este valabil și pentru dacă/altfel: compilatorul poate ordona ramurile pe baza știind care dintre ele este numită mai des.
- Dead Code Separation - codul care nu a fost apelat în timpul testelor poate fi mutat într-o secțiune specială pentru a preveni intrarea în paginile de memorie utilizate frecvent.
- Separarea codului EH - codul de gestionare a excepțiilor care este executat în cazuri excepționale poate fi mutat într-o secțiune separată dacă este posibil să se determine că excepțiile sunt declanșate în condiții specifice definite.
- Intrinseci ale memoriei - Funcțiile de memorie precum memset, memcpy și altele pot fi încorporate sau optimizate pentru cele mai comune dimensiuni de bloc.
Implementări
Tehnicile de optimizare PGO sunt implementate, în special, de către compilatori:
Note
- ↑ Optimizări ghidate de profil . Consultat la 15 februarie 2012. Arhivat din original pe 22 februarie 2012. (nedefinit)
- ↑ Clang Compiler User's Manual - Clang 3.9 documentation . clang.llvm.org. Preluat la 6 mai 2016. Arhivat din original la 15 septembrie 2011. (nedefinit)