Onko olemassa sellaista työkalua, jolla voisin selvittää, kuinka kauan kutakin funktiota suoritetaan ohjelman aikana? Eräs käyttämäni ohjelma toimii paikoitellen todella hitaasti ja olisi kiva tietää, mikä silmukka tai funktio vie eniten aikaa. Toisaalta ohjelmassa on tuhansia rivejä koodia, joten breakpointtien laittaminen koodiin yksi kerrallaan on hidasta, sillä en edes tiedä, mitä funktioita ajon aikana kutsutaan. Kyseessä on Linux-ohjelma ja kielenä C.
Ehkäpä kätevin on valgrindin callgrind-toiminto yhdessä jonkin graafisen näkymän kanssa.
Toinen vaihtoehto on GNU-työkalujen yhteydessä gprof, joka on joissain suhteissa rajoittuneempi ja hankalampi käyttää. Siihen osaan kuitenkin antaa lyhyet ohjeet. :) Käännä ohjelma valitsimella -pg. Nyt ohjelman ajaminen tuottaa tiedoston gmon.out, josta profiilitiedot saa ulos ohjelmalla gprof.
# käännös tehdään muuten normaalisti, mutta mukana on -pg-lippu: gcc koodi.c -O -o ohjelma.bin -pg # ohjelman ajaminen tapahtuu aivan normaalisti: ./ohjelma.bin # profiilin tarkastelu onnistuu gprof-ohjelmalla: gprof ohjelma.bin gmon.out
Jos optimointitaso on suurempi kuin -O, profiilista voi tulla vaikeatulkintainen, koska kääntäjä muokkaa koodia jo aika rankalla kädellä.
Profiilin alku voisi näyttää tältä:
Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ns/call ns/call name 30.65 0.20 0.20 100000000 2.02 2.02 funktio 27.59 0.38 0.18 frame_dummy 26.05 0.56 0.17 100000000 1.72 1.72 toinen 16.86 0.67 0.11 main
Yksi tapa selvittää missä funktiossa ohjelma kuluttaa suurimman osan ajastaan on aja ohjelmaa debuggerissa, ja keskeyttää ohjelman suoritus satunnaisesti esim. 10 kertaa. Jos ohjelmassa on jokin funktio joka kuluttaa suurimman osan ajasta, satunnainen keskeytys sattuu mitä luultavimmin silloin kun kyseistä funktiota suoritetaan.
Tällä menetelmällä ei saa tarkkaa tietoa suoritusajoista, mutta toisinaan se on nopea tapa selvittää mahdollisia pullonkauloja. Bonuksena on se, ettei ohjelmaa tarvitse erikseen kääntää profilointilipuilla.
Rajoituksia tietysti on paljon, kuten yksinkertaiselta menetelmältä voi olettaa: ei toimi interaktiivisille ohjelmille, ei toimi mikäli ohjelma ei ole melko prosessorirajoitteinen (ts. suorittamassa jotain koko ajan), ...
Aihe on jo aika vanha, joten et voi enää vastata siihen.