Profilování
Profilování je vyhledávání míst v programu, která jsou vhodná pro optimalizaci. Vyhledávání probíhá s pomocí speciálních nástrojů, nazývaných profilery, za běhu programu (tj. forma dynamické analýzy). Na základě konkrétního požadavku na optimalizaci se sleduje například využití paměti, doba a frekvence provádění různých částí programu, systémová volání a podobně.
Možnosti konkrétního profileru závisí na programovacím jazyku, možnostech kompilátoru a platformě na které sledovaný program běží. Pro efektivní využívaní výstupních dat profileru k optimalizaci programu je důležité brát v potaz možné zkreslení výsledků vzniklé samotným připojením profileru k programu a metodou sběru dat.
Optimalizaci práce s pamětí na základě výstupů z profilování řeší programátor. V programovacích jazycích typu C bez pokročilé správy paměti vyžaduje sledování paměti zásah programátora. Na platformách Java a .NET se při profilování paměti sleduje využívaná paměť, její alokace a uvolnění pomocí garbage collectoru.
Historie
Nástroje pro analýzu výkonnosti existovaly již pro systémy IBM/360 a IBM/370 po roce 1970. Obvykle byly založeny na využití časovače, pomocí kterého se zaznamenávaly čas a stav vykonávaného programu (tzv. PSW, anglicky program status word), takže bylo možné najít tak zvaná horká místa programu. Na začátku roku 1974 byly uvedeny simulátory instrukční sady procesoru, které umožnily plné sledování průběhu výpočtu a přinesly další možnosti sledování výkonnosti.
Pro unixové systémy byl v roce 1979 uveden jednoduchý nástroj prof
, který vypisoval všechny použité funkce a jak dlouho jejich provedení trvalo. V roce 1982 rozšířil tento koncept nástroj gprof, který vytvářel kompletní analytické grafy volání (anglicky call graph).[1]
V roce 1994 publikovali zaměstnanci firmy Digital Equipment Corporation Amitabh Srivastava a Alan Eustace práci popisující ATOM[2], což je platforma pro konverzi programů na svůj vlastní profiler. ATOM funguje tak, že při kompilaci vkládá do výstupního kódu části, které poskytují data pro analýzu. Tato technika se nazývá instrumentace (anglicky instrumentation).
V roce 2004 byly práce popisující Gprof a ATOM zařazeny na seznam 50 nejvýznamnějších prací v PLDI (anglicky Programming Language Design and Implementation).[3]
Typy profilerů v závislosti na výstupních datech
Flat profilery
Flat profilery zaznamenávají u jednotlivých funkcí průměrnou dobu zpracování, ale nesledují odkud a jak často jsou volány.
Call-graph profilery
Call-graph profilery (Call-graph = graf volání funkcí) zaznamenávají dobu a četnost volání funkcí, včetně výpisu zásobníku volání funkcí (parametry funkcí se nezaznamenávají).
Typy profilerů v závislosti na granularitě dat
Podle typu sběru dat jsou profilery řazeny do dvou skupin na statické profilery a event-based profilery.
Statické profilery
Některé profilery pracují jako sběrače vzorků. Takovýto vzorkovací profiler sbírá data z cílového programu v pravidelných intervalech, to dělá pomocí vyvolání přerušení v operačním systému. Vzorkovací profily bývají obvykle méně přesné, ale umožňují cílovému programu běžet téměř plnou rychlostí.
Výsledná data nejsou přesná ale statisticky přibližná. "Skutečné množství chyb je větší nežli jedna perioda. Ve skutečnosti, pokud je n vzorkovacích period, potom očekávaná chyba je rovna " [4]
V praxi potom může takovýto vzorkovací profiler poskytovat přesnější obraz o běhu cílového programu, než ostatní způsoby a to proto, že do běhu cílového program nezasahují natolik aby ho ovlivnili což může mít za následek paměťovou náročnost či zpomalení běhu.
Dedikovaný hardware může jít i nad rámec toho. ARM Cortex-M3 a některé MIPOS procesory mají registr zvaný PCSAMPLE, ten sbírá data z programového čítače a jeho účast je téměř nezjistitelná.
Nejčastěji používané statické profilery jsou AMD CodeAnalyst, Apple Inc. Shark (OSX), oprofile (Linux), Intel VTune, Parallel Amplifier (část Intel Parallel Studio) a Oracle Solaris Studio Performance Analyzer.[5]
Event-based
- Java: JVMTI (JVM Tools Interface) API, dříve známo jako JVMPI (JVM Profiling Iterface) poskytuje cestu jak zachytávat některé události jako je spuštění vlákna, jeho ukončení apodobně.
- .Net: Lze připojit profilovací agent jako COM server CLR za použití Profiling API. Podobně jako Java poskytuje prostředky jak zachytávat události jako je vstup a opuštění metody nebo vytvoření objektu.
- Python: Profilování zahrnuje profil modulu, hotshot (call-graf based) a použití 'sys.setprofile', c_{call,return,exception}, python_{call,return,exception}.
- Ruby: Používá podobné profilování jako Python, Flat-profiler v profile.rb, modul, Ruby-prof C-extension.
Instrumentace
Tato technika účinně přidává instrukce do cílového programu za účelem shromáždit požadované informace. Přidané instrukce můžou však změnit změnu výkonu a v některých případech může vést i k nepřesnosti výsledků. Vliv závisí na tom, jaké informace jsou shromažďovány a na tom jaká je úroveň podrobností. Například přidání kódu počítání každého volání procedury/rutiny bude mít pravděpodobně menší vliv než počítat, kolikrát každý příkaz poslechl. Některé počítače mají přidaný speciální hardware pro sběr informací. V tom případě je dopad na běh programu mnohem menší. Přístrojové vybavení je klíčem k určování úrovně kontroly a času, který je potřeba.
- Manuálně: Určuje programátor např. přidáním kódu na měření času určitého úkonu a to vlastní metodou nebo pomocí API, např. Application Response Measurement.
- Automatický kód: Strojově přidán do zdrojového kódu pomocí automatického nástroje např. Parasoft Insure++
- Intermediate language: Instrumentace přidána do sestavy nebo binárního kódu, vhodné pro více jazyků vyšší úrovně, např. OpenPAT.
- Asistence kompilátoru: gprof, Quantify používá metody: gcc -pg ... pro gprof, a quantify g++..., pro Quantify.
- Binární překlad: Nástroj přidá instrumentaci do zkompilovaného spustitelného souboru, např. ATOM.
- Runtime instrumentace: Proběhne přímo před provedením kódu. Běh programu je následně plně pod dohledem nástroje, např. Pin, Valgrind, DynamoRIO.
- Runtime přidání: Kód je upraven za běhu aby byla provedena pomocná funkce, např. DynInst.
Reference
V tomto článku byl použit překlad textu z článku Profiling (computer programming) na anglické Wikipedii.
- Gprof: a Call Graph Execution Profiler http://docs.freebsd.org/44doc/psd/18.gprof/paper.pdf
- http://www.stanford.edu/class/cs295/papers/atom.pdf
- http://www.cs.utexas.edu/users/mckinley/20-years.html
- Statistical Inaccuracy of gprof Output. www.cs.utah.edu [online]. [cit. 21-04-2015]. Dostupné v archivu pořízeném dne 29-05-2012.
- (2013) "Suitability of Performance Tools for OpenMP Task-Parallel Programs" in Proc. 7th Int'l Workshop on Parallel Tools for High Performance Computing.: 25–37.