¿Cómo imprimir la diferencia de tiempo en la precisión de milisegundos y nanosegundos de C en Linux?

4 minutos de lectura

avatar de usuario
Raj Sanpui

Tengo este programa que imprime la diferencia de tiempo entre 2 instancias diferentes, pero imprime con una precisión de segundos. Quiero imprimirlo en milisegundos y otro en nanosegundos de diferencia.

//Prints in accuracy of seconds

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

int main(void)
{
    time_t now, later;
    double seconds;

    time(&now);
    sleep(2);

    time(&later);
    seconds = difftime(later, now);

    printf("%.f seconds difference", seconds);
}

¿Cómo puedo lograr eso?

  • ¿En qué plataforma estás?

    – interjay

    29 de abril de 2013 a las 9:40

  • esto podría ayudar: stackoverflow.com/questions/13610471/…

    – Ismet Alkan

    29 de abril de 2013 a las 9:40

  • @interjay: Lo siento, debería haber mencionado eso, es Linux. compilador gcc.

    – Raj Sanpui

    29 de abril de 2013 a las 9:42

  • No se puede tener una precisión de nanosegundos. stackoverflow.com/questions/13610471/…

    – lucasg

    29 de abril de 2013 a las 9:42

  • @georgesl tu lata obtener tiempo con precisión de nanosegundos en Linux. Sin embargo, no se garantiza que esto tenga una precisión de nanosegundos, ya que creo que puede ser una interpolación entre dos valores de microsegundos según el reloj interno de la CPU en la mayoría de las arquitecturas. Siempre puedes usar clock_getres aunque para encontrarlo.

    – Voluntad

    29/04/2013 a las 10:30

avatar de usuario
Basile Starynkevitch

Lea primero el tiempo(7) página de manual

Entonces, puedes usar clock_gettime(2) syscall (es posible que deba vincular -lrt para conseguirlo).

Así que podrías intentar

    struct timespec tstart={0,0}, tend={0,0};
    clock_gettime(CLOCK_MONOTONIC, &tstart);
    some_long_computation();
    clock_gettime(CLOCK_MONOTONIC, &tend);
    printf("some_long_computation took about %.5f seconds\n",
           ((double)tend.tv_sec + 1.0e-9*tend.tv_nsec) - 
           ((double)tstart.tv_sec + 1.0e-9*tstart.tv_nsec));

No espere que los temporizadores de hardware tengan una precisión de nanosegundos, incluso si dan una resolución de nanosegundos. Y no intente medir duraciones de tiempo inferiores a varios milisegundos: el hardware no es lo suficientemente fiel. También puede querer usar clock_getres para consultar la resolución de algún reloj.

  • eso es cierto su trabajo para mí. muchas gracias @Basile

    – EsmaeelE

    6 de agosto de 2017 a las 0:20


  • El hardware que no es “lo suficientemente fiel” para medir intervalos de sub-ms es una afirmación dudosa. De ser cierto, requeriría una explicación dada la precisión de los osciladores de cristal.

    – gsimard

    21 de octubre de 2018 a las 1:45

  • No estoy seguro de que el reloj típico de una PC de consumo típica tenga una precisión relativa de 1e-10. La mayoría de los relojes no son tan precisos. Los que sí cuestan probablemente más que un coche. Ni siquiera puedo nombrar al proveedor de tales relojes de alta precisión.

    – Basile Starynkevitch

    21 de octubre de 2018 a las 5:52

  • Para la evaluación comparativa computacional, es mejor usar CLOCK_PROCESS_CPUTIME_ID en lugar de CLOCK_MONOTONIC

    – Lotario

    3 de marzo de 2021 a las 8:45

  • Reordenaría el cálculo para minimizar los errores de redondeo: (double) (tend.tv_sec - tstart.tv_sec) + 1.0e-9 * (double) (tend.tv_nsec - tstart.tv_nsec)

    – HAL9000

    5 oct 2021 a las 21:42

avatar de usuario
Ciro Santilli Путлер Капут 六四事

timespec_get de C11

Esta función devuelve nanosegundos, redondeados a la resolución de la implementación.

Ejemplo de: http://en.cppreference.com/w/c/chrono/timespec_get :

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

int main(void)
{
    struct timespec ts;
    timespec_get(&ts, TIME_UTC);
    char buff[100];
    strftime(buff, sizeof buff, "%D %T", gmtime(&ts.tv_sec));
    printf("Current time: %s.%09ld UTC\n", buff, ts.tv_nsec);
}

Producción:

Current time: 02/18/15 14:34:03.048508855 UTC

Más detalles aquí: https://stackoverflow.com/a/36095407/895245

  • Esto es genial. ¿Hay alguna manera fácil de concatenar buff y ts.tv_sec en una sola cadena? Intenté usar .append() en cpp sin éxito.

    – p.suerte

    16 de diciembre de 2020 a las 18:48

  • @p.luck no estoy seguro de entender la pregunta. quieres decir concatenar ts.tv_sec y ts.nsec en una sola cadena? Por ese algo a lo largo strftime %D %T %s + un segundo snprintf llamar: stackoverflow.com/questions/3774417/…

    – Ciro Santilli Путлер Капут 六四事

    16 dic 2020 a las 21:45


avatar de usuario
yairgd

aquí hay una macro simple para lidiar con eso

#include <time.h>
#define CHECK_TIME(x) {\
    struct timespec start,end;\
    clock_gettime(CLOCK_REALTIME, &start);\
    x;\
    clock_gettime(CLOCK_REALTIME, &end);\
    double f = ((double)end.tv_sec*1e9 + end.tv_nsec) - ((double)start.tv_sec*1e9 + start.tv_nsec); \
    printf("time %f ms\n",f/1000000); \
    }

y aquí está cómo usarlo:

CHECK_TIME(foo(a,b,c))

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad