usar - tiempo de ejecucion en nanosegundos c++




¿Cómo medir el tiempo de ejecución REAL de un programa C en Linux? (2)

Sé que es posible que esta pregunta ya se haya formulado antes, pero parece que la mayoría de esas preguntas se refieren al tiempo transcurrido (basado en el reloj de pared) de un fragmento de código. El tiempo transcurrido de un fragmento de código es poco probable igual al tiempo de ejecución real , ya que otros procesos pueden estar ejecutándose durante el tiempo transcurrido del código de interés.

Usé getrusage () para obtener el tiempo del usuario y la hora del sistema de un proceso, y luego calculo el tiempo de ejecución real por (tiempo del usuario + tiempo del sistema). Estoy ejecutando mi programa en Ubuntu. Aquí están mis preguntas:

  1. ¿Cómo sé la precisión de getrusage ()?
  2. ¿Hay otros enfoques que pueden proporcionar una mayor precisión que getrusage ()?

La función getrusage () es la única forma estándar / portátil que conozco para obtener "tiempo de CPU consumido".

No hay una forma simple de determinar la precisión de los valores devueltos. Estaría tentado de llamar al getrusage () una vez para obtener un valor inicial, y llamarlo repetidamente hasta que los valores devueltos sean diferentes del valor inicial, y luego asumir que la precisión efectiva es la diferencia entre el inicial y el final valores. Esto es un truco (sería posible que la precisión sea más alta de lo que determina este método, y el resultado probablemente debería considerarse una estimación del peor caso), pero es mejor que nada.

También me preocuparía la precisión de los valores devueltos. Bajo algunos kernels esperaría que un contador se incremente para cualquier código que se esté ejecutando cuando se produce un IRQ de temporizador; y, por lo tanto, es posible que un proceso tenga mucha suerte (y se bloquee continuamente justo antes de que ocurra el IRQ del temporizador) o muy desafortunado (y se desbloquea justo antes de que ocurra el IRQ del temporizador). En este caso, "afortunado" podría significar que un cerdo de CPU parece que no usa tiempo de CPU, y "desafortunado" podría significar que un proceso que utiliza muy poco tiempo de CPU parece un cerdo de CPU.

Para versiones específicas de núcleos específicos en arquitecturas específicas (dependiendo de si / cuando el kernel se compila con opciones de configuración específicas en algunos casos), puede haber alternativas de mayor precisión que no son portátiles y no son estándar ...


Puede verificar el tiempo de CPU real de un proceso en Linux utilizando la funcionalidad de CPU Time del kernel:

 #include <time.h>

 clock_t start, end;
 double cpu_time_used;

 start = clock();
 ... /* Do the work. */
 end = clock();
 cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

Fuente: http://www.gnu.org/s/hello/manual/libc/CPU-Time.html#CPU-Time

De esta manera, usted cuenta los tics de la CPU o la cantidad real de instrucciones trabajadas por la CPU en el proceso, obteniendo así la cantidad real de tiempo de trabajo.





time