Pro optimalizaci netrivialniho programu je treba nejdriv najit, co presne optimalizovat, tedy kde program travi nejvice casu - to nam rika tzv. *casovy profil* programu. Existuje nekolik zakladnich moznosti: == gprof == GNU gprof je zakladni nastroj pro casove profilovani. Najdete ho vsude, zato je nejmene presny a nabizi nejmene featurek. Jak ho pouzit? Preklad: gcc -pg -o program ... Spusteni: ./program # ... vygeneruje soubor gmon.out Vyhodnoceni: gprof ./program | less Program gprof funguje na principu statistickeho samplovani. Tzn. radove 100x za sekundu program zastavi, podiva se na aktualni misto v pameti, ktere program vyhodnocuje (a zasobnik, tzn. "kudy se tam dostal") a zaznamena sample do souboru. To znamena, ze z jednotlivych behu programu ziskame vzdy trochu jine vysledky a aby mereni konvergovala ke skutecnemu profilu, musime nasbirat dostatecne mnozstvi samplu (i.e. nechat program bezet dost dlouho). == google-perftools == Moderni kolega programu gprof. Preklad: gcc -g -lprofiler -o program ... Spusteni: CPU_PROFILE=soubor ./program Vyhodnoceni: google-pprof ./program soubor Dokaze korektne zprofilovat i inline funkce a krome textoveho vystupu i nakreslit pekny graf. Jinak pracuje na podobnem principu jako gprof. == perf (linux-tools), oprofile == Moderni procesory nabizeji sadu specialnich registru - citacu udalosti. Ty lze nakonfigurovat, aby sledovaly ruzne druhy udalosti, od zakladniho "instruction retired" (instrukce vlezla do pipeline a procesor ji zacal zpracovavat) az po sledovani uspesnosti predikce skoku, pristupu do pameti a cachovani atd. Pomoci techto registru muzeme tedy vytvaret profily programu nejen casove. Citace (performance counters) samotne nam nedavaji informaci o tom, _kde_ se dany citac inkrementuje. Kazdy citac ma proto nastaveny i urcity prah; pokud pretece tento prah, program se zastavi a zaznamena, kde doslo k preteceni - profil preteceni opet bude konvergovat k opravdovemu profilu. Preklad: gcc -g -o program ... Spusteni: perf record -- ./program Vyhodnoceni: perf report ./program perf annotate ./program Nastroj perf byva soucasti baliku linux-tools (je pomerne tesne spjat s linuxovym jadrem). Jeho starsi alterantivou je nastroj oprofile; nevyhodou je ponekud idiosynkraticke ovladani a nutnost pracovat pod rootem, vyhodou je ale moznost GUI ovladani a lepsi podpora sledovani vice udalosti najednou. perf i oprofile nam navic neposkytnou profil pouze na uroven funkci, ale az na uroven jednotlivych instrukci. Zde vsak musime byt opatrni, cas straveny v nejake instrukci je totiz "rozmazany" i na nekolik nasledujicich instrukci - jde o efekt vznikajici kvuli pipelinovanemu zpracovani instrukci; pokud se nejaka instrukce pocita dlouho, vetsinou mezitim do pipeline vstoupilo nekolik dalsich instrukci a z vnejsiho hlediska tedy "dlouho trva" az nektera dalsi instrukce. Stejny efekt maji i bubliny v pipeline vznikajici z registrovych zavislosti atd. Na druhou stranu s pomoci profilu snadno muzeme hotspoty opravit prostym preskladanim instrukci nebo zmenou pouzitych registru, gcc zde casto neodvede zdaleka perfektni praci. == callgrind, cachegrind == Nastroj valgrind je popularni program pro hledani chyb v praci s pameti. To vsak ve skutecnosti obstarava jeho podprogram memcheck; valgrind jako takovy je jednoduse emulator procesoru, ktery dovoluje tzv. instrumentaci, tedy ruzne nastroje se mohou napojovat na ruzne udalosti, memcheck tedy kontroluje udalosti tykajici se pameti. Valgrind vsak nabizi i dalsi nastroje, mezi nimi callgrind a cachegrind. Ty umoznuji sbirani tentokrat presneho profilu programu, bud casoveho, nebo cachoveho (cachegrind umi relativne presne emulovat chovani cachi procesoru, na kterem jej poustime). Preklad: gcc -g -o program ... Spusteni: valgrind --tool=cachegrind ./program Vyhodnoceni: callgrind_annotate ./program kcachegrind ./program Nejkomfortnejsi pristup k profilu nabizi GUI nastroj kcachegrind. Za zminku stoji i tzv. profile-driven optimalizace, ktere dokaze provadet samo gcc. Nektere optimalizace totiz zavisi na tom, jakym zpusobem a na jakych datech program realne pracuje, napr. ocekavany vysledek podminek, pocet iteraci smycek, jak casto se vola funkce nebo i zpusob provadeni aritmetickeho deleni. gcc podporuje tzv. "profile arcs instrumentation", kdy prelozi program tak, aby na klicovych mistech sbiral statistiky o hodnote vyrazu; pri dalsim prekladu pak tato mereni vyuzije pri provadeni optimalizaci. Tuto funkci ovlada cela rada prepinacu, z uzivatelskeho hlediska vsak staci v prvnim priblizeni znat: gcc -fprofile-generate -O3 -o program ... ./program