2011-04-13 26 views
7

¿Hay alguna manera simple de cómo medir el tiempo de cálculo en C? Intenté utilizar el tiempo cuando lo ejecuté, pero necesito medir parte específica de un programa.C - tiempo de cálculo de medición

Gracias

+1

¿Quiere decir que quiere perfilar su código? Si es así, eche un vistazo a esta pregunta: http://stackoverflow.com/questions/1794816/recommendations-for-c-profilers – Naveen

+0

Depende del sistema operativo y la cadena de herramientas en uso. Por favor agrega etiquetas apropiadas. – wallyk

Respuesta

11

Puede utilizar la función clock en <time.h> junto con la macro CLOCKS_PER_SEC:

clock_t start = clock() ; 
do_some_work() ; 
clock_t end = clock() ; 
double elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ; 

Ahora elapsed_time mantiene el tiempo que se tardó en llamar do_some_work, en fracciones de segundo.

+1

El único problema aquí es que 'CLOCKS_PER_SEC', pero el valor suele ser 60 o 100, por lo que el tiempo no es muy preciso. Puedes hacer mucho en 10 o 17 ms si tu procesador tiene múltiples núcleos y funciona a 3 GHz. –

+1

Eso es cierto, pero estoy bastante seguro de que esto es lo mejor que se puede obtener con puro ANSI C. En Windows, puede usar timeGetTime o incluso QueryPerformanceCounter para hacerlo mejor. –

+2

Si 'do_some_work()' es muy rápido, podría ser necesario ponerlo dentro de un ciclo que lo repite muchas veces, como 10,000,000 y dividir el tiempo transcurrido por el mismo número para calcular el tiempo de una unidad de trabajo. – wallyk

2

Puede probar el generador de perfiles "gprof". Más información aquí: http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

+1

Puede intentarlo, pero puede que no le guste. [Vea aquí.] (Http://stackoverflow.com/questions/4981121/how-exactly-does-gprof-work/5046039#5046039) –

+0

@Mike, nunca supe los problemas de recursión. Gracias por señalar esto. – BiGYaN

0

@codebolt - ¡Gracias! muy agradable. En Mac OS X, agregué un include de time.h, y pegué en tus cuatro líneas. Luego imprimí los valores de inicio, fin (enteros) y tiempo transcurrido. 1mS de resolución.

output: 
3 X: strcpy .name, .numDocks: start 0x5dc end 0x5e1 elapsed: 0.000005 
calloc: start 0x622 end 0x630 elapsed: 0.000014 

en mi programa foo.c tengo

#include <libc.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

pero funciona sin incluir explícitamente time.h. Uno de los otros hay que llevarlo en

código real:.

clock_t start = clock() ; 

strcpy(yard2.name, temp); /* temp is only persistant in main... */ 
strcpy(yard1.name, "Yard 1"); 
strcpy(yard3.name, "3 y 3 a 3 r 3 d 3"); 
yard1.numDocks = MAX_DOCKS; /* or so I guess.. */ 
yard2.numDocks = MAX_DOCKS; /* or so I guess.. */ 
yard3.numDocks = MAX_DOCKS; /* or so I guess.. */ 

clock_t end = clock() ; 
double elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ; 
printf("3 X: strcpy .name, .numDocks: start 0x%x end 0x%x elapsed: %-12:8f \n", start, end, elapsed_time); 


start = clock() ; 
arrayD = calloc(yard2.numDocks, sizeof(struct dock)); /* get some memory, init it to 0 */ 
end = clock() ; 

elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ; 
printf("calloc: start 0x%x end 0x%x elapsed: %-12:8f \n", start, end, elapsed_time); 
1

general, usted puede utilizar la función de clock() para obtener los tiempos de inicio y fin de una sola llamada a la función que se está probando. Si, sin embargo, do_some_work() es particularmente rápido, tiene que ser puesto en un bucle y tener el costo del bucle en sí un factor fuera, algo así como:

#define COUNT 10000 

// Get cost of naked loop. 

clock_t start_base = clock(); 
for (int i = count; i > 0; i--) 
    ; 
clock_t end_base = clock(); 

// Get cost of loop plus work. 

clock_t start = clock(); 
for (int i = count; i > 0; i--) 
    do_some_work() ; 
clock_t end = clock(); 

// Calculate cost of single call. 

double elapsed_time = end - start - (end_base - start_base); 
elapsed_time = elapsed_time/CLOCKS_PER_SEC/COUNT; 

Esto tiene al menos dos ventajas:

  • obtendrá un tiempo promedio que es más representativo del tiempo real que debería tomar; y
  • obtendrás una respuesta más precisa en el caso en que la función clock() tenga una resolución limitada.
Cuestiones relacionadas