Profilování programů v C Ivana Hutařová Vařeková
2 Obsah 1. profilování programu 2. nástroje ● gprof ● callgrind/kcachegrind ● ostatní (sprof, oprofile,... ) 3. odkazy
3 Profilování programu I ● Profilování programu = “vyhledávání míst v programu, které jsou vhodná pro optimalizaci” ● “Bottlenecks occur in surprising places, so don't try to second guess and put in a speed hack until you have proven that's where the bottleneck is.” - Rob Pike
4 Profilování programu II ● We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.” ● - Donald Knut
5 Profilování programu - postup III Standartní kroky při profilování s použitím automatickýho nástrojů: (1) ( přeložení zdrojového kódu s nutnými volbami překladače - nutné jen u některých nástrojů) (2) vygenerování profilovacích dat (3) analýza profilovacích dat
6 Profilování programu – výstupy (IV) ● flat profile – průměrná doba běhu procedur
7 Profilování programu – výstupy (V) call-graph profile zobrazuje: kým byla funkce volána které funkce volala
8 Nástroje ● gprof - The GNU Profiler ● valgrind (callgrind*, kcachegrind) ● sprof ● OProfile...
9 gprof (I) součást balíku gprof (1) přeložení kódu: přidáme přepínač -pg gcc -pg program.c -o program (2) vygenerování profilovacích dat: (3)./program < vstup (4) zpracování dat: gprof./program
10 gprof - překlad (II) gcc -pg program.c -o program přepínač -pg znamená: ● překladač přidá na začátek každé funkce program.c příkaz, který uloží ● odkud byla funkce volána ● bude prováděno samplovaní (intervaly 10ms) ● program se přeruší (syscall profil) a je zjištěno, v které funkci se nachází ● na zavěr programu jsou vypsána získaná data
11 gprof - generování dat (III)./program < vstup ● při skončení běhu vytvoří v aktuálním adresáři soubor gmon.out ● pokud soubor existoval je přepsán ● gprof používá gmon.out jako vstup
12 gprof - flat profile (IV) %time - procento času strávené v funkci name self seconds - třídící kritérium - počet sekund strávených ve funkci name calls - počet volání dané funkce name
13 gprof – flat profile (V) časy běhu procedur jsou určovány samplováním = v případě krátkých běhů procedur (100ms) nepřesné
14 gprof – call graph (VI)
15 gprof – výhody/nevýhody (VII) - překlad programu s volbou -pg (nutné i u knihoven pokud je chceme zahrnout) - samplování není přesné (problémy u krátkých funkcí) - pozor na přepsání výstupu gmon.out + jednoduché ovládání + není výrazný nárust délky běhu programu (v radu procent)
16 valgrind a spol. (I) ● přeložení kódu: není potřeba nic nestandartního ● vygenerování profilovacích dat: valgrind --tool=callgrind program ● sledování běhu/průběžné výpisy dat callgrind_control ● zpracování dat: callgrind_annotate - textové kcachegrind – grafické (balík – kdesdk)
17 valgrind – generování dat (II) valgrind --tool=callgrind./program ● vypíše profilovací data do souboru: callgrind.out.$PID... ● počet instrukcí vykonaných funkcí, ● kdo/kolikrát funkci volal, koho/kolikrát funkce volala ● suffix výstupního programu je standartně $PID, ale může být unikátní per thread,...
18 valgrind – užitečná nastavení (III) --dump-instr=yes ● výstupní soubor bude obsahovat informace per instrukci (umožní výpis po řádku kódu) ● --simulate-cache=yes ● umožní generování informací o využití cache
19 valgrind - callgrind_controll (IV) callgrind_controll $pid|program vypíše status valgrindu spuštěného na procesu definovaneho jménem program nebo pidem -l,--longvypíše adresář kde je valgrind spuštěn -b vypíše aktuální backtrace
20 valgrind - callgrind_controll (V) callgrind_control -d xxx $PID|program ● provede dump aktuálních dat do souboru ● -z vynuluje countery
21 valgrind - callgrind_annotate (VI) callgrind_annotate callgrind.out.$pid ● vyhodnotí profilovací data programu který doběhl --tree=none|caller|calling|both ● přepíná mezi druhy výpisu --inclusive=yes|no ● přepíná inkludování podfunkcí --threshold=100 ● procento času běhu které nás zajímá
22 valgrind - callgrind_annotate (VII) $ callgrind_annotate –inclusive=yes callgrind.out.123
23 valgrind - callgrind_annotate (VIII) ● má problemy s detekcí rekurze v procedurách ● kcachegrind má tento problém vyřešen
24 valgrind - kcachegrind (IX)
25 valgrind - kcachegrind flat profile (X) Incl – délka behu včetně podfunkcí Self – délka běhu bez podfunkcí Called – počet volání funkce Function – jméno funkce
26 valgrind - kcachegrind call graph(XI)
27 valgrind – výhody/nevýhody (XII) - výrazné zpomalení doby běhu programu (10-ti nasobky) + není nutný překlad programu se speciálními nastaveními (-g pro “source code“ výstup) + je možné ladit programy které neskončili běh + variabilita nastavení profilování + variabilita nastavení způsobu výstupu + kcachegrind
28 další nástroje ● sprof ● součást glibc-common ● OProfile ● samostatný balík ( ● skládá se z driveru pro kernel a daemona, který sbírá data a nástrojů pro vyhodnocení těchto dat ● provádí samplování ●...
29 ODKAZY (I) ● profiling obecně: ● ● ● gprof: ●
30 ODKAZY (II) ● valgrind/calgrind/kcachegrind ● ● ● ● /usr/share/doc/valgrind-3.4.1/valgrind_manual.pdf ● další profilery: ● ●