Tiempo de ejecución del programa C.
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_second
valor.
¿ No estoy seguro de cómo Clocks_per_second
se 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
CLOCKS_PER_SEC
es 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.
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
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;
}