View this PageEdit this PageUploads to this PageVersions of this PageHomeRecent ChangesSearchHelp Guide

profiling with gcc (-p)

Usando gprof (compilando con gcc -pg)


Según esta página, se resume en lo siguiente:

Al compilar y al linkar se añade un "-pg":
cc -g -c myprog.c utils.c -pg
cc -o myprog myprog.o utils.o -pg


Con eso se genera un gmon.out.

Si añades a las opciones de compilación "-Q", entonces sólo se guarda el tiempo en cada función, sin el "call data":
Flat profile:
     
     Each sample counts as 0.01 seconds.
       %   cumulative   self              self     total
      time   seconds   seconds    calls  Ts/call  Ts/call  name
      44.12      0.07     0.07                             zazLoop
      35.29      0.14     0.06                             main
      20.59      0.17     0.04                             bazMillion


Una última cosa es que si tu programa compilado con profilng da un sigsegv al arrancar, suele ser por las librerías enlazadas dinámicamente. Para evitar ese roblema se ha de compilar con "-static" o con "-static-libgcc", por ejemplo:
 gcc -g -pg -static-libgcc myprog.c utils.c -o myprog

Para hacer "line-by-line-profiling", en vez de usar gprof se usa el progrma gcov

Alternativa: usando Valgrind/Callgrind


Para programas que no sean i/o-bound (es decir, que el factor limitante no sea I/O a disco), se puede hacer el profiling usando una de las utilidades del valgrind: callgrind (en salchicha no está, pero por ejemplo sí que está en phonedevel).

1. Se compila con depuración activada ("-g"):
 gcc -g miprograma.c -o miprograma
2. Se ejecuta a través del callgrind:
 valgrind --tool=callgrind --dump-instr=yes --simulate-cache=yes --collect-jumps=yes ./miprograma parametros
3. Se visualiza el resultado (callgrind.out.*) con el kcachegrind:
 kcachegrind