![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
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/CallgrindPara 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 miprograma2. Se ejecuta a través del callgrind: valgrind --tool=callgrind --dump-instr=yes --simulate-cache=yes --collect-jumps=yes ./miprograma parametros3. Se visualiza el resultado (callgrind.out.*) con el kcachegrind: kcachegrind |