Tiempo de ejecución del programa C.

Resuelto Roger asked hace 13 años • 18 respuestas

Tengo un programa en C que pretende ejecutarse en paralelo en varios procesadores. Necesito poder registrar el tiempo de ejecución (que puede oscilar entre 1 segundo y varios minutos). He buscado respuestas, pero todas parecen sugerir el uso de la clock()función, que luego implica calcular la cantidad de relojes que tomó el programa dividido por el Clocks_per_secondvalor.

¿ No estoy seguro de cómo Clocks_per_secondse calcula el valor?

En Java, simplemente tomo la hora actual en milisegundos antes y después de la ejecución.

¿Existe algo similar en C? He echado un vistazo, pero parece que no puedo encontrar una manera de obtener algo mejor que una segunda resolución.

También soy consciente de que un generador de perfiles sería una opción, pero estoy buscando implementar un temporizador yo mismo.

Gracias

Roger avatar Mar 09 '11 23:03 Roger
Aceptado

CLOCKS_PER_SECes una constante que se declara en <time.h>. Para obtener el tiempo de CPU utilizado por una tarea dentro de una aplicación C, utilice:

clock_t begin = clock();

/* here, do your time-consuming job */

clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

Tenga en cuenta que esto devuelve la hora como tipo de punto flotante. Esto puede ser más preciso que un segundo (por ejemplo, mide 4,52 segundos). La precisión depende de la arquitectura; en los sistemas modernos se obtienen fácilmente 10 ms o menos, pero en máquinas Windows más antiguas (de la era Win98) estaba más cerca de los 60 ms.

clock()es el estándar C; Funciona "en todas partes". Hay funciones específicas del sistema, como getrusage()en los sistemas tipo Unix.

El de Java System.currentTimeMillis()no mide lo mismo. Es un "reloj de pared": puede ayudarle a medir cuánto tiempo tardó en ejecutarse el programa, pero no le dice cuánto tiempo de CPU se utilizó. En sistemas multitarea (es decir, todos), estos pueden ser muy diferentes.

Thomas Pornin avatar Mar 09 '2011 16:03 Thomas Pornin

Si está utilizando el shell Unix para ejecutar, puede usar el comando de tiempo.

haciendo

$ time ./a.out

asumir a.out como ejecutable le dará el tiempo necesario para ejecutar esto

S..K avatar Mar 09 '2011 16:03 S..K

En vainilla simple C:

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

int main()
{
    clock_t tic = clock();

    my_expensive_function_which_can_spawn_threads();

    clock_t toc = clock();

    printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);

    return 0;
}
Alexandre C. avatar Mar 09 '2011 16:03 Alexandre C.