GNU/Linux >> Tutoriales Linux >  >> Linux

Medición del tiempo transcurrido en linux para un programa c

Tres alternativas

  1. clock()
  2. gettimeofday()
  3. clock_gettime()

clock_gettime() va hasta una precisión de nanosegundos y admite 4 relojes.

  • RELOJ_HORA REAL

    Reloj en tiempo real para todo el sistema. Configurar este reloj requiere los privilegios apropiados.

  • RELOJ_MONOTÓNICO

    Reloj que no se puede configurar y representa un tiempo monótono desde algún punto de inicio no especificado.

  • CLOCK_PROCESS_CPUTIME_ID

    Temporizador por proceso de alta resolución desde la CPU.

  • CLOCK_THREAD_CPUTIME_ID

    Reloj de tiempo de CPU específico del subproceso.

Puedes usarlo como

#include <time.h>

struct timespec start, stop;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);

/// do something

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &stop);

double result = (stop.tv_sec - start.tv_sec) * 1e6 + (stop.tv_nsec - start.tv_nsec) / 1e3;    // in microseconds

Nota:La función de reloj () devuelve el tiempo de CPU para su proceso, no el tiempo de reloj de pared. Creo que esto es lo que le interesaba al OP. Si se desea la hora del reloj de pared, gettimeofday() es una buena opción como se sugiere en una respuesta anterior. clock_gettime() puede hacer cualquiera de los dos si su sistema lo admite; en mi sistema integrado de linux clock_gettime() no es compatible, pero clock() y gettimeofday() sí lo son.

A continuación se muestra el código para obtener la hora del reloj de pared usando gettimeofday()

#include <stdio.h> // for printf()
#include <sys/time.h> // for clock_gettime()
#include <unistd.h> // for usleep()

int main() {
    struct timeval start, end;
    long secs_used,micros_used;

    gettimeofday(&start, NULL);
    usleep(1250000); // Do the stuff you want to time here
    gettimeofday(&end, NULL);

    printf("start: %d secs, %d usecs\n",start.tv_sec,start.tv_usec);
    printf("end: %d secs, %d usecs\n",end.tv_sec,end.tv_usec);

    secs_used=(end.tv_sec - start.tv_sec); //avoid overflow by subtracting first
    micros_used= ((secs_used*1000000) + end.tv_usec) - (start.tv_usec);

    printf("micros_used: %d\n",micros_used);
    return 0;
}

Para empezar, necesita usar aritmética de punto flotante. Cualquier valor entero dividido por un valor entero mayor será cero, siempre.

Y, por supuesto, deberías hacer algo entre obtener las horas de inicio y fin.

Por cierto, si tienes acceso a gettimeofday normalmente se prefiere a clock ya que tiene mayor resolución. O tal vez clock_gettime que tiene una resolución aún mayor.


Linux
  1. Linux:¿herramienta para medir la calidad de la entropía?

  2. ¿Cómo precargar un programa para un inicio más rápido?

  3. Los mejores relojes gratuitos para Linux

  4. 7 ejemplos de comandos Linux hwclock para configurar la fecha y la hora del reloj del hardware

  5. Cómo configurar la ID del proceso en Linux para un programa específico

Comando de tiempo de Linux

Cronopete:un clon de Time Machine de Apple para Linux

Cómo ejecutar un comando durante un tiempo específico en Linux

Los 5 mejores programas de seguimiento del tiempo para Linux

Guía de inicio rápido de Ansible para administradores de sistemas Linux

Los 20 mejores programas de seguimiento de tiempo para escritorio Linux