¿Cómo usar struct timeval para obtener el tiempo de ejecución?

Después de leer este artículo sobre el tiempo transcurrido, escribí un código simple para calcular el tiempo de ejecución de un bucle:

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

El comstackdor clang me da los siguientes errores:

 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. 

No puedo entender qué está mal con mi código, ¿alguna idea?

Tienes dos errores tipográficos en tu código:

  struct timeval, 

debiera ser

  struct timeval 

y después del paréntesis de printf() necesitas un punto y coma.

Además, dependiendo del comstackdor, un ciclo tan simple podría optimizarse, dándole un tiempo de 0 microsegundos, sin importar lo que haga.

Finalmente, el cálculo del tiempo es incorrecto. Solo tienes en cuenta los segundos, ignorando los microsegundos. tv_usec obtener la diferencia entre segundos, multiplicar por un millón, luego agregar “después de” tv_usec y restar “antes de” tv_usec . No ganas nada lanzando un número entero de segundos a un flotador.

Yo sugeriría revisar la página de struct timeval .

Este es el código:

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

Cambio:

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

a:

 struct timeval tvalBefore, tvalAfter; 

Es menos probable (IMO) cometer este error si hay una sola statement por línea:

 struct timeval tvalBefore; struct timeval tvalAfter; 

Se vuelve más propenso a errores cuando se declaran punteros a tipos en una sola línea:

 struct timeval* tvalBefore, tvalAfter; 

tvalBefore es una struct timeval* pero tvalAfter es una struct timeval .