clock_realtime - clock_gettime example
Tiempo de medición tomado por una función: clock_gettime (4)
Estoy tratando de medir cuánto tiempo dura una función.
Tengo un pequeño problema: aunque trato de ser preciso y uso puntos flotantes, cada vez que imprimo mi código con% lf obtengo una de dos respuestas: 1.000 ... o 0.000 ... Esto me lleva a preguntarme si mi código es correcto
#define BILLION 1000000000L;
// Calculate time taken by a request
struct timespec requestStart, requestEnd;
clock_gettime(CLOCK_REALTIME, &requestStart);
function_call();
clock_gettime(CLOCK_REALTIME, &requestEnd);
// Calculate time it took
double accum = ( requestEnd.tv_sec - requestStart.tv_sec )
+ ( requestEnd.tv_nsec - requestStart.tv_nsec )
/ BILLION;
printf( "%lf/n", accum );
La mayor parte de este código no ha sido hecho por mí. Esta página de ejemplo tenía un código que ilustra el uso de clock_gettime: http://www.users.pjwstk.edu.pl/~jms/qnx/help/watcom/clibref/qnx/clock_gettime.html
¿Alguien podría decirme qué es incorrecto o por qué solo obtengo valores enteros, por favor?
Muchas gracias,
Jary
Dividir un entero por un entero da como resultado un entero. Prueba esto:
#define BILLION 1E9
Y no use un punto y coma al final de la línea. #define
es una directiva de preprocesador, no una declaración, e incluyendo el punto y coma, dio como resultado que se definiera BILLION como 1000000000L;
, que se rompería si tratara de usarlo en la mayoría de los contextos. Tuviste suerte porque lo usaste al final de una expresión y fuera de cualquier paréntesis.
Sé que la pregunta se publicó hace mucho tiempo, pero aún no veo la respuesta que sugiera "convertir" el tiempo transcurrido en nanosegundos (o milisegundos) y no en segundos como en el ejemplo de código.
El fragmento de código de muestra para ilustrar la idea:
long accum = ( requestEnd.tv_nsec - requestStart.tv_nsec )
+ ( requestEnd.tv_sec - requestStart.tv_sec ) * BILLION;
De esta manera puede evitar la aritmética de punto flotante, que puede ser pesada para algunas plataformas ...
Tenga en cuenta que (requestEnd.tv_nsec - requestStart.tv_nsec) puede ser negativo, en cuyo caso debe restar 1 segundo de la diferencia tv_sec y agregar un BILLION a la diferencia tv_nsec.
( requestEnd.tv_nsec - requestStart.tv_nsec )
es de tipo entero, y siempre es menor que BILLION
, por lo que el resultado de dividir uno por otro en aritmética de enteros siempre será 0
. Es necesario convertir el resultado de la resta para, por ejemplo, double
antes de hacer la división.