example clock_realtime clock_gettime c timing clock

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.