2010-02-28 13 views
42

¿Existe una biblioteca simple para comparar el tiempo que lleva ejecutar una parte del código C? Lo que quiero es algo así como:¿Cómo puedo comparar el código C fácilmente?

int main(){ 
    benchmarkBegin(0); 
    //Do work 
    double elapsedMS = benchmarkEnd(0); 

    benchmarkBegin(1) 
    //Do some more work 
    double elapsedMS2 = benchmarkEnd(1); 

    double speedup = benchmarkSpeedup(elapsedMS, elapsedMS2); //Calculates relative speedup 
} 

También sería grande si la biblioteca le permiten hacer muchas carreras, con un promedio de ellos y el cálculo de la varianza en el tiempo!

+0

Gran pregunta, esto me ha ayudado mucho. –

+1

Alternativas a la temporización dentro del programa: http://stackoverflow.com/questions/7456146/is-there-a-better-way-to-benchmark-ac-program-than-timing –

+1

Gran pregunta cerrada de Linux: http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux –

Respuesta

33

Básicamente, todo lo que quiere es un temporizador de alta resolución. El tiempo transcurrido es, por supuesto, solo una diferencia en los tiempos y la aceleración se calcula dividiendo los tiempos para cada tarea. He incluido el código para un temporizador de alta resolución que debería funcionar al menos en Windows y Unix.

#ifdef WIN32 

#include <windows.h> 
double get_time() 
{ 
    LARGE_INTEGER t, f; 
    QueryPerformanceCounter(&t); 
    QueryPerformanceFrequency(&f); 
    return (double)t.QuadPart/(double)f.QuadPart; 
} 

#else 

#include <sys/time.h> 
#include <sys/resource.h> 

double get_time() 
{ 
    struct timeval t; 
    struct timezone tzp; 
    gettimeofday(&t, &tzp); 
    return t.tv_sec + t.tv_usec*1e-6; 
} 

#endif 
+6

La hora de Wallclock (tal como la devuelve 'gettimeofday') puede no ser tan útil -' clock_gettime (CLOCK_PROCESS_CPUTIME_ID, ...) 'a menudo será lo que se desee allí. – caf

+4

@caf: Un programa que utiliza muy poco tiempo de CPU pero que pasa mucho tiempo bloqueando E/S o esperando que la E/S asincrónica aún pueda ser percibida por los usuarios como lenta. Tanto el tiempo de CPU como el reloj de pared son importantes. – bk1e

+7

Sí, es por eso que califiqué mi comentario con las palabras comadrejas "may" y "often";) Por cierto, si el tiempo de wallclock * es * deseado, entonces 'clock_gettime (CLOCK_MONOTONIC, ...)' es una mejor opción , porque a diferencia de 'gettimeofday' no se verá afectado por cambios en el reloj del sistema durante el intervalo de tiempo. – caf

1

En POSIX, pruebe getrusage. El argumento relevante es RUSAGE_SELF y los campos relevantes son ru_utime.tv_sec y ru_utime.tv_usec.

+1

Tenga en cuenta que esto realmente no se implementa en muchos sistemas operativos UNIX que usan 'procfs' en su lugar. (Linux, Solaris) – charliehorse55

0

Puede haber utilidades existentes que ayuden con esto, pero sospecho que la mayoría usará algún tipo de muestreo o posiblemente inyección. Pero para obtener secciones específicas de código cronometradas, probablemente tendrá que agregar llamadas a un temporizador como el que muestra en su ejemplo. Si está usando Windows, entonces el temporizador de alto rendimiento funciona. I answered a similar question y mostró un código de ejemplo que hará eso. Hay métodos similares para Linux.

26

utilizar la función clock() se define en time.h:

startTime = (float)clock()/CLOCKS_PER_SEC; 

/* Do work */ 

endTime = (float)clock()/CLOCKS_PER_SEC; 

timeElapsed = endTime - startTime; 
+0

¡Esta debería ser la respuesta aceptada en lugar de la específica de Windows! – Simon

Cuestiones relacionadas