GNU/Linux >> Linux Esercitazione >  >> Linux

Misurazione del tempo trascorso in Linux per un programma c

Tre alternative

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

clock_gettime() arriva fino alla precisione del nanosecondo e supporta 4 orologi.

  • CLOCK_REALTIME

    Orologio in tempo reale a livello di sistema. L'impostazione di questo orologio richiede privilegi appropriati.

  • CLOCK_MONOTONIC

    Orologio che non può essere impostato e rappresenta il tempo monotono da un punto di partenza non specificato.

  • CLOCK_PROCESS_CPUTIME_ID

    Timer per processo ad alta risoluzione dalla CPU.

  • CLOCK_THREAD_CPUTIME_ID

    Orologio del tempo della CPU specifico del thread.

Puoi usarlo come

#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 funzione clock() restituisce l'ora della CPU per il tuo processo, non l'ora dell'orologio. Credo che questo sia ciò a cui l'OP era interessato. Se si desidera l'ora dell'orologio da parete, allora gettimeofday() è una buona scelta come suggerito da una risposta precedente. clock_gettime() può fare entrambe le cose se il tuo sistema lo supporta; sul mio sistema integrato Linux clock_gettime() non è supportato, ma clock() e gettimeofday() lo sono.

Di seguito è riportato il codice per ottenere l'ora dell'orologio da parete utilizzando 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;
}

Per cominciare devi usare l'aritmetica in virgola mobile. Qualsiasi valore intero diviso per un valore intero più grande sarà zero, sempre.

E ovviamente dovresti davvero fare qualcosa tra ottenere l'ora di inizio e di fine.

A proposito, se hai accesso a gettimeofday è normalmente preferito a clock in quanto ha una risoluzione maggiore. O forse clock_gettime che ha una risoluzione ancora più elevata.


Linux
  1. Linux Sleep Command:ritardo per un periodo di tempo specificato

  2. Linux:strumento per misurare la qualità dell'entropia?

  3. I migliori orologi gratuiti per Linux

  4. Come impostare l'ID processo in Linux per un programma specifico

  5. In che modo Linux utilizza un orologio in tempo reale?

Comando dell'ora di Linux

Cronopete:un clone della macchina del tempo di Apple per Linux

Come eseguire un comando per un tempo specifico in Linux

I 5 migliori software di monitoraggio del tempo per Linux

Guida rapida ad Ansible per amministratori di sistema Linux

I 20 migliori software di monitoraggio del tempo per desktop Linux