Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ debuggaustyökalu funktion ajoajan selvittämiseen

Jaska [23.12.2010 14:34:29]

#

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.

Metabolix [23.12.2010 14:59:26]

#

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

Schedler [24.12.2010 03:43:09]

#

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), ...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta