2012-10-04 18 views
6

Po przeczytaniu this article o upływ czasu, napisałem prosty kod, aby obliczyć czas wykonania pętli:Jak korzystać z struct timeval, aby uzyskać czas wykonania?

#include <stdio.h> 
#include <sys/time.h> 

int main (int argc, char** argv) { 
    struct timeval, tvalBefore, tvalAfter; 

    gettimeofday (&tvalBefore, NULL); 
    int i =0; 
    while (i < 1000) { 
     i ++; 
    } 

    gettimeofday (&tvalAfter, NULL); 

    printf("Time in microseconds: %0.3f microseconds\n", 
      (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
     ) 
    return 0; 
} 

Kompilator dzyń daje mi następujące błędy:

print_time.c:7:16: error: expected identifier or '(' 
     struct timeval, *tvalBefore, *tvalAfter; 
        ^
print_time.c:13:17: error: use of undeclared identifier 'tvalBefore' 
     gettimeofday (&tvalBefore, NULL); 
        ^
print_time.c:19:17: error: use of undeclared identifier 'tvalAfter' 
     gettimeofday (&tvalAfter, NULL); 
        ^
print_time.c:22:12: error: use of undeclared identifier 'tvalAfter' 
         (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
           ^
print_time.c:22:31: error: use of undeclared identifier 'tvalBefore' 
         (float)(tvalAfter.tv_sec - tvalBefore.tv_sec) 
               ^
5 errors generated. 

nie mogę dowiedzieć się, co jest nie tak z moim kodem, jakiś pomysł?

+2

Wyjąć że przecinek po 'struct timeval' – LSerni

+3

Nie używaj gettimeofday mierzyć czas wykonania! Przeczytaj to: http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time i to: http://stackoverflow.com/questions/12392278/getrusage -vs-clock-gettime-vs-clock-vs-gettimeofday/12480485 # 12480485 –

+1

@ DouglasB.Staple dzięki za powiadomienie mnie o tym numerze – mko

Odpowiedz

18

Masz dwie literówek w kodzie:

struct timeval, 

powinny być

struct timeval 

i po printf() nawiasie trzeba średnik.

Ponadto, w zależności od kompilatora, tak prosty cykl może być po prostu zoptymalizowany, dając ci czas 0 mikrosekund, cokolwiek robisz.

Wreszcie, obliczenie czasu jest nieprawidłowe. Uwzględniasz tylko sekundy, ignorując mikrosekundy. Musisz uzyskać różnicę między sekundami, pomnożyć przez milion, następnie dodać "po" tv_usec i odjąć "przed" tv_usec. Nic nie zyskujesz, rzucając całkowitą liczbę sekund na spławik.

Sugeruję sprawdzenie strony man dla struct timeval.

Jest to kod:

#include <stdio.h> 
#include <sys/time.h> 

int main (int argc, char** argv) { 
    struct timeval tvalBefore, tvalAfter; // removed comma 

    gettimeofday (&tvalBefore, NULL); 
    int i =0; 
    while (i < 10000) { 
     i ++; 
    } 

    gettimeofday (&tvalAfter, NULL); 

    // Changed format to long int (%ld), changed time calculation 

    printf("Time in microseconds: %ld microseconds\n", 
      ((tvalAfter.tv_sec - tvalBefore.tv_sec)*1000000L 
      +tvalAfter.tv_usec) - tvalBefore.tv_usec 
     ); // Added semicolon 
    return 0; 
} 
+0

dziękuję za odpowiedź! Byłem tak beztroski – mko

+1

"... strona podręcznika dla" struct timeval "." Jaka jest strona man? W moim systemie nie ma strony podręcznika dla "struct" lub "timeval". – neirbowj

+0

Prawdopodobnie masz to pod 'man 2 gettimeofday' lub' man 3p gettimeofday'. Wygląda na to, że kilka stron podręcznika jest przenoszonych w różnych dystrybucjach. – LSerni

7

Zmiana:

struct timeval, tvalBefore, tvalAfter; /* Looks like an attempt to 
              delcare a variable with 
              no name. */ 

do:

struct timeval tvalBefore, tvalAfter; 

Jest mniej prawdopodobne (IMO), aby ten błąd jeśli jest jedna deklaracja na linię:

struct timeval tvalBefore; 
struct timeval tvalAfter; 

To staje się bardziej podatny na błędy podczas deklarowania wskaźników dla typów w jednym wierszu:

struct timeval* tvalBefore, tvalAfter; 

tvalBefore jest struct timeval* ale tvalAfter jest struct timeval.

+0

+1 za sugerowanie użycia oddzielnej linii – mko

Powiązane problemy