GNU/Linux >> Tutoriels Linux >  >> Linux

Mesurer le temps écoulé sous Linux pour un programme c

Trois alternatives

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

clock_gettime() va jusqu'à la précision de la nanoseconde et prend en charge 4 horloges.

  • CLOCK_REALTIME

    Horloge en temps réel à l'échelle du système. Le réglage de cette horloge nécessite les privilèges appropriés.

  • CLOCK_MONOTONIC

    Horloge qui ne peut pas être réglée et représente un temps monotone depuis un point de départ non spécifié.

  • CLOCK_PROCESS_CPUTIME_ID

    Minuterie par processus haute résolution du CPU.

  • CLOCK_THREAD_CPUTIME_ID

    Horloge de temps CPU spécifique au thread.

Vous pouvez l'utiliser comme

#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

Remarque :La fonction clock() renvoie le temps CPU pour votre processus, pas l'heure de l'horloge murale. Je crois que c'est ce qui intéressait l'OP. Si l'heure de l'horloge murale est souhaitée, alors gettimeofday() est un bon choix, comme suggéré par une réponse précédente. clock_gettime() peut faire l'un ou l'autre si votre système le supporte; sur mon système Linux embarqué, clock_gettime() n'est pas pris en charge, mais clock() et gettimeofday() le sont.

Vous trouverez ci-dessous le code permettant d'obtenir l'heure de l'horloge murale à l'aide de 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;
}

Pour commencer, vous devez utiliser l'arithmétique à virgule flottante. Toute valeur entière divisée par une valeur entière plus grande sera toujours zéro.

Et bien sûr, vous devriez réellement faire quelque chose entre obtenir les heures de début et de fin.

Au fait, si vous avez accès à gettimeofday il est normalement préféré à clock car il a une résolution plus élevée. Ou peut-être clock_gettime qui a une résolution encore plus élevée.


Linux
  1. Tutoriel de commande de temps Linux pour les débutants (avec exemples)

  2. Comment précharger un programme pour un démarrage plus rapide ?

  3. Meilleures horloges gratuites pour Linux

  4. 7 Exemples de commande Linux hwclock pour définir la date et l'heure de l'horloge matérielle

  5. Mesurer le temps sous Linux - time vs clock vs getrusage vs clock_gettime vs gettimeofday vs timespec_get ?

Commande de temps Linux

Cronopete - Un clone de Time Machine d'Apple pour Linux

Comment exécuter une commande pendant une durée spécifique sous Linux

Top 5 des logiciels de suivi du temps pour Linux

Guide de démarrage rapide d'Ansible pour les administrateurs système Linux

Les 20 meilleurs logiciels de suivi du temps pour Linux Desktop