2012-10-04 17 views
6

Dopo aver letto this article circa il tempo trascorso, ho scritto un semplice codice per calcolare il tempo di esecuzione di un ciclo:Come utilizzare struct timeval per ottenere il tempo di esecuzione?

#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; 
} 

Il compilatore clang mi dà i seguenti errori:

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. 

non posso capire cosa c'è di sbagliato nel mio codice, qualche idea?

+2

Estrarre la virgola dopo la 'struct timeval' – LSerni

+3

Non utilizzare gettimeofday per misurare il tempo di esecuzione! Leggi questo: http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time e questo: http://stackoverflow.com/questions/12392278/getrusage -vs-clock-gettime-vs-clock-vs-gettimeofday/12480485 # 12480485 –

+1

@ DouglasB.Staple grazie per avermi fatto conoscere questo numero – mko

risposta

18

Hai due errori di battitura nel codice:

struct timeval, 

dovrebbe essere

struct timeval 

e dopo la parentesi di printf() avete bisogno di un punto e virgola.

Inoltre, a seconda del compilatore, un ciclo così semplice potrebbe essere semplicemente ottimizzato, offrendo un tempo di 0 microsecondi qualunque cosa tu faccia.

Infine, il calcolo del tempo è errato. Si prendono in considerazione solo i secondi, ignorando i microsecondi. È necessario ottenere la differenza tra secondi, moltiplicare per un milione, quindi aggiungere "dopo" tv_usec e sottrarre "prima" tv_usec. Non guadagni nulla gettando un numero intero di secondi in un float.

Suggerirei di controllare la pagina man per struct timeval.

Questo è il codice:

#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

grazie per la risposta! Ero così incurante – mko

+1

"... la pagina man di 'struct timeval'." Che pagina man è? Sul mio sistema non esiste una pagina man per 'struct' o 'timeval'. – neirbowj

+0

Probabilmente ce l'hai con 'man 2 gettimeofday' o' man 3p gettimeofday'. Apparentemente diverse pagine di testo tendono ad essere spostate in diverse distribuzioni. – LSerni

7

Cambio:

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

a:

struct timeval tvalBefore, tvalAfter; 

è meno probabile (IMO) per fare questo errore se v'è una sola dichiarazione per riga:

struct timeval tvalBefore; 
struct timeval tvalAfter; 

E ' diventa più incline agli errori quando si dichiarano i puntatori ai tipi su una singola riga:

struct timeval* tvalBefore, tvalAfter; 

tvalBefore è un struct timeval* ma tvalAfter è un struct timeval.

+0

+1 per suggerire usare la linea separata – mko

Problemi correlati