2013-04-29 14 views
20

Mam ten program, który drukuje różnicę czasu między 2 różnymi instancjami, ale drukuje z dokładnością do sekund. Chcę wydrukować go w milisekundach, a inny w różnicy nanosekund.Jak wydrukować różnicę czasu w dokładności milisekund i nanosekund od C w systemie Linux?

//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); 
} 

Jak mogę to zrobić?

+1

Co platforma jesteś stronie? – interjay

+2

może to pomóc: http://stackoverflow.com/questions/13610471/calculating-function-time-in-nanoseconds-in-c-code –

+0

@interjay: Przepraszam, powinienem był o tym wspomnieć, to jest Linux. kompilator gcc. – kingsmasher1

Odpowiedz

34

Przeczytaj najpierw stronę podręcznika użytkownika time(7).

Następnie można użyć systemu clock_gettime(2) syscall (może być konieczne połączenie -lrt, aby go uzyskać).

Więc można spróbować

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)); 

Nie oczekuj liczniki sprzętowe mieć dokładność nanosekund, nawet jeśli dają rozdzielczość nanosekund. I nie próbuj mierzyć czasu trwania krótszego niż kilka milisekund: sprzęt nie jest wystarczająco wierny. Możesz także użyć polecenia clock_getres, aby sprawdzić rozdzielczość niektórych zegarów.

+0

To jest prawdziwa praca dla mnie. bardzo dziękuję @Basile – EsmaeelE

5

timespec_get z C11 powraca do nanosekund, zaokrąglone do rozdzielczości wdrożenia.

Przykład z: 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); 
} 

wyjściowa:

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

Więcej szczegółów tutaj: https://stackoverflow.com/a/36095407/895245

Powiązane problemy