2011-09-14 10 views
5

Estoy depurando una aplicación C y me gustaría saber cuánto tiempo pasa en una función particular.medir el tiempo en una función en C

Podría cambiar el código fuente y agregar más código para hacer la medición, pero no me parece correcto. Prefiero hacerlo con una aplicación externa, sin volver a compilar todo el tiempo.

me di cuenta que es posible establecer un punto de quiebre en el BGF, así que pensé, debe ser posible realizar un seguimiento del tiempo usando una herramienta similar al procedimiento sencillo: - establecer punto de interrupción - cuando se detiene, medir el tiempo real y el plazo la función - al salir de la función, medir el tiempo nuevamente sin embargo, no he encontrado una manera de cómo hacer esto en gDB :(

cualquier idea Gracias

Respuesta

2

Si está utilizando GCC, que quieres? la opción de compilación "-pg" y la aplicación gprof.

+0

'gprof' me mostrará cuántas veces se llamó una función, pero no quiere mostrarme veces. Simplemente dice "no time accumulated" –

+0

Luego, tal vez fue optimizado o algo así. –

1

La creación de perfiles es probablemente lo que desea. Eche un vistazo a prof o gprof.

ACTUALIZACIÓN: Después de compilng con "cc -Wall -ggdb -pg -g3 -O2 diskhash.c -o diskhash" (y ejecutar el programa), "gprof -p diskhash" me da:

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
32.60  0.41  0.41  1 410.75 646.18 create_hashtab 
31.80  0.81  0.40 5087692  0.00  0.00 hash_func 
27.83  1.16  0.35 2543846  0.00  0.00 find_hash 
    2.78  1.20  0.04 2543846  0.00  0.00 chop_a_line 
    1.59  1.22  0.02        main 
    0.40  1.22  0.01        frame_dummy 
    0.00  1.22  0.00  4  0.00  0.00 map_da_file 
2

gprof solo es confiable, según mi experiencia, solo funciona en absoluto, si vincula estáticamente -pg versiones compiladas de cada biblioteca, incluida la biblioteca C. Puede probar para hacer esto usando la opción gcc -profile (que hace lo que -pg hace más intenta sub en las bibliotecas -pg) pero el problema es que a GNU libc realmente no le gusta estar estáticamente vinculado, y su distribución puede no proporcionar -pg versiones compiladas de cada biblioteca que necesitas

Sugiero que pruebe cachegrind, que es un modo de operación valgrind y solo necesita información de depuración para todo. Eso es mucho más fácil de conseguir. El problema es que tiene enormes costos generales; tan grande que podría invalidar su prueba. Esperar al menos una ralentización de 2x.

También puedes probar perf - si puedes conseguir una copia. Es muy inteligente, pero es de, por y para los hackers del núcleo que creen que las personas como construyen cosas desde el principio. He tenido mucha suerte con eso. (Do leer http://web.eecs.utk.edu/~vweaver1/projects/perf-events/ que es acerca de la API subyacente, no la utilidad, pero aún podría salvarte de una gran cantidad de tiempo perdido.)

2

que tienen una función de ayuda en mi ~/.gdbinit:

define timeme 
set $last=clock() 
n 
set $timing=clock() - $last 
if $timing>$arg0 
printf "***long***\n" 
end 
printf "%d cycles, %f seconds\n", $timing, (float)$timing/1000000 
end 

Es posible que deba ajustar el 1000000 dependiendo de cuál sea su implementación de CLOCKS_PER_SEC en su plataforma.

El uso es trivial; ejecute el ayudante que ejecutará el siguiente paso y dar información de temporización:

Breakpoint 2, install_new_payload_from_meta (snmp_meta=0x7eee81c0, pkt=0x0, entry=0x7d4f4e58) at /home/sgillibr/savvi-dc-snmp/recipies.c:187 
(gdb) timeme 100000 
***long*** 
580000 cycles, 0.580000 seconds 
(gdb) 

Obviamente resolución puede no ser suficiente para algunas necesidades, aunque no resultar muy útil.

+0

Lo probé para la función sleep() en el archivo C, no funciona, el resultado siempre es 0. – CodyChan

1

Pon esto en tu ~ /.gdbinit

define timeme 
    python import time 
    python starttime=time.time() 
    next 
    python print("Previous takes: " + (str)(time.time()-starttime) + "s") 
end 
document timeme 
    Measure executing time of next function 
    Usage: timeme or ti 
end 

tipo timeme o ti cuando se desea medir el tiempo de la siguiente función.

Cuestiones relacionadas