C – gettimeofday para tiempo de computación?

¿Sabes cómo usar gettimeofday para medir el tiempo de computación? Puedo medir una vez por este código:

char buffer[30]; struct timeval tv; time_t curtime; gettimeofday(&tv, NULL); curtime=tv.tv_sec; strftime(buffer,30,"%m-%d-%Y %T.",localtime(&curtime)); printf("%s%ld\n",buffer,tv.tv_usec); 

Éste se hace antes de computar, segundo después. ¿Pero sabes cómo restarlo?

Edición: necesito resultados en milisegundos. Y por cierto, ¿por qué no puedo comentar y ver los botones al editar y crear nuevas preguntas?

Su variable curtime tiene la cantidad de segundos desde la época. Si obtiene uno antes y otro después, el último menos el anterior es el tiempo transcurrido en segundos. Puedes restar los valores de time_t bien.

Para restar timevales:

 gettimeofday(&t0, 0); /* ... */ gettimeofday(&t1, 0); long elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec; 

Esto se supone que trabajará con intervalos más cortos que ~ 2000 segundos, momento en el cual la aritmética puede desbordarse según los tipos utilizados. Si necesita trabajar con intervalos más largos, simplemente cambie la última línea a:

 long long elapsed = (t1.tv_sec-t0.tv_sec)*1000000LL + t1.tv_usec-t0.tv_usec; 

Si desea medir la eficiencia del código, o de alguna otra forma medir los intervalos de tiempo, lo siguiente será más fácil:

 #include  int main() { clock_t start = clock(); //... do work here clock_t end = clock(); double time_elapsed_in_seconds = (end - start)/(double)CLOCKS_PER_SEC; return 0; } 

hth

La respuesta ofrecida por @Daniel Kamil Kozar es la respuesta correcta: gettimeofday en realidad no debe usarse para medir el tiempo transcurrido. Utilice clock_gettime (CLOCK_MONOTONIC) en su lugar.


Las páginas del manual dicen: el tiempo devuelto por gettimeofday () se ve afectado por saltos discontinuos en la hora del sistema (por ejemplo, si el administrador del sistema cambia manualmente la hora del sistema). Si necesita un reloj monótonamente creciente, consulte clock_gettime (2).

El Opengroup dice: las aplicaciones deben usar la función clock_gettime () en lugar de la función obsoleta gettimeofday ().

Parece que a todo el mundo le encanta gettime of day hasta que se topa con un caso en el que no funciona o no está allí (VxWorks) … clock_gettime es increíblemente increíble y portátil.

<<

No. gettimeofday NUNCA debe usarse para medir el tiempo .

Esto está causando errores por todo el lugar. Por favor, no agregue más errores.