Mätning av förfluten tid i linux för ett c-program

Mätning av förfluten tid i linux för ett c-program

Tre alternativ

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

clock_gettime() går upp till nanosekunders noggrannhet och den stöder 4 klockor.

  • CLOCK_REALTIME

    Systemomfattande realtidsklocka. Att ställa in den här klockan kräver lämpliga privilegier.

  • CLOCK_MONOTONIC

    Klocka som inte går att ställa och representerar monoton tid sedan någon ospecificerad startpunkt.

  • CLOCK_PROCESS_CPUTIME_ID

    Högupplöst timer per process från processorn.

  • CLOCK_THREAD_CPUTIME_ID

    Trådspecifik CPU-tidklocka.

Du kan använda den som

#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

Obs:Funktionen clock() returnerar CPU-tid för din process, inte väggklockan. Jag tror att detta är vad OP var intresserad av. Om väggklocka önskas, är gettimeofday() ett bra val, vilket föreslagits av ett tidigare svar. clock_gettime() kan göra endera om ditt system stöder det; på mitt inbäddade linux-system stöds inte clock_gettime() men clock() och gettimeofday() är det.

Nedan finns koden för att få väggklockan med 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;
}

Till att börja med måste du använda flyttalsaritmetik. Varje heltalsvärde dividerat med ett större heltalsvärde kommer alltid att vara noll.

Och självklart borde du faktiskt göra något mellan att få start- och sluttid.

Förresten, om du har tillgång till gettimeofday det är normalt att föredra framför clock eftersom den har högre upplösning. Eller kanske clock_gettime som har ännu högre upplösning.