programacion - ¿Cómo puedo encontrar el tiempo de ejecución de una sección de mi programa en C?
programacion en c++ (11)
Estoy tratando de encontrar la manera de obtener el tiempo de ejecución de una sección de código en C. Ya he intentado tanto time () como clock () desde time.h, pero parece que time () devuelve segundos y reloj () parece darme milisegundos (¿o centisegundos?). Sin embargo, me gustaría algo más preciso. ¿Hay alguna manera de tomar el tiempo con una precisión de al menos microsegundos?
Esto solo necesita poder compilar en Linux.
Eche un vistazo a gettimeofday , clock_ * , u get / setitimer .
Es posible que desee buscar una herramienta de instrumentación en google.
No encontrará una llamada a la biblioteca que le permita pasar la resolución del reloj de su plataforma. Utilice un generador de perfiles (man gprof) como sugirió otro cartel, o bien, rápido y sucio, ponga un círculo alrededor de la sección ofensiva del código para ejecutarlo muchas veces, y use clock ().
Por lo que vale, aquí hay una que son solo unas pocas macros:
#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);
Entonces solo úsalo con:
main() {
START;
// Do stuff you want to time
STOP;
PRINTTIME;
}
Pruebe con "bench.h" ; te permite poner un START_TIMER; y STOP_TIMER ("nombre"); en su código, lo que le permite comparar de forma arbitraria cualquier sección de código (nota: solo se recomienda para secciones cortas, no para cosas que tarden docenas de milisegundos o más). Es preciso para el ciclo del reloj, aunque en algunos casos raros puede cambiar la forma en que se compila el código intermedio, en cuyo caso es mejor utilizar un generador de perfiles (aunque los perfiles generalmente requieren más esfuerzo para secciones específicas del código).
Solo funciona en x86.
Quieres una aplicación de perfilador .
Palabras clave de búsqueda en SO y motores de búsqueda: perfiles linux
Hiciste referencia a clock()
y time()
- ¿estabas buscando gettimeofday()
? Eso completará una struct timeval
, que contiene segundos y microsegundos.
Por supuesto, la resolución real depende del hardware.
Depende de las condiciones. Los perfiladores son agradables para las vistas globales generales; sin embargo, si realmente necesita una vista precisa, mi recomendación es KISS. Simplemente ejecute el código en un bucle de tal manera que demore un minuto o más en completarse. Luego calcule un promedio simple basado en el tiempo de ejecución total y las iteraciones ejecutadas.
Este enfoque le permite:
Obtenga resultados precisos con temporizadores de baja resolución.
No se debe tener en cuenta que la instrumentación interfiere con los cachés de alta velocidad (l2, l1, branch..etc) cerca del procesador. Sin embargo, ejecutar el mismo código en un círculo cerrado también puede proporcionar resultados optimistas que pueden no reflejar las condiciones del mundo real.
No sabe en qué entorno / sistema operativo está trabajando, pero su tiempo puede ser impreciso si otro hilo, tarea o proceso reemplaza su código temporizado en el medio. Sugiero explorar mecanismos como mutexes o semáforos para evitar que otros subprocesos preemsen su proceso.
gettimeofday()
proporciona una resolución de microsegundos, mientras que clock_gettime()
proporciona una resolución de nanosegundos.
int clock_gettime(clockid_t clk_id, struct timespec *tp);
El clk_id
identifica el reloj que se utilizará. Use CLOCK_REALTIME
si desea que un reloj de todo el sistema sea visible para todos los procesos. Use CLOCK_PROCESS_CPUTIME_ID
para el temporizador por proceso y CLOCK_THREAD_CPUTIME_ID
para un temporizador específico del subproceso.
Si está desarrollando en x86 o x64, ¿por qué no utiliza el contador de sellos de tiempo: RDTSC ?
Será más confiable que las funciones de Ansi C como time () o clock () ya que RDTSC es una función atómica. El uso de funciones C para este propósito puede presentar problemas, ya que no se garantiza que el hilo en el que se ejecutan no se desconecte y, como resultado, el valor que devuelvan no será una descripción precisa del tiempo real de ejecución que se intenta medir. .
Con RDTSC puedes medir esto mejor. Deberá convertir la cuenta de ticks en un formato de H: M: S de tiempo legible para el ser humano, que dependerá de la frecuencia de reloj del procesador, pero estará en google y estoy seguro de que encontrará ejemplos.
Sin embargo, incluso con RDTSC incluirá el tiempo en que su código se desconectó de la ejecución, mientras que una mejor solución que utilizar el reloj () / clock () si necesita una medida exacta tendrá que recurrir a un generador de perfiles que instrumentará su código y tener en cuenta cuando su código no se está ejecutando realmente debido a cambios de contexto o lo que sea.