Calcular tiempo de ejecución

En ZSH
julio@acer ~> time ./programa
Hello World!
./programa 1.54s user 0.03s system 97% cpu 1.611 total
julio@acer ~> type -a time
time is a reserved word
julio@acer ~> which time
time: shell reserved word
julio@acer ~> sudo pacman -S time
julio@acer ~> /usr/bin/time ./programa
Hello World!
1.39user 0.00system 0:01.41elapsed 99%CPU (0avgtext+0avgdata 8940maxresident)k
0inputs+0outputs (0major+758minor)pagefaults 0swaps
julio@acer ~> /usr/bin/time -v ./programa
Hello World!
Command being timed: "./programa"
User time (seconds): 1.57
System time (seconds): 0.05
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.63
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 8936
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 758
Voluntary context switches: 1
Involuntary context switches: 181
Swaps: 0
File system inputs: 0
File system outputs: 3160
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
julio@acer ~> /usr/bin/time -p ./programa
Hello World!
real 1.45
user 1.44
sys 0.00
alias time='/usr/bin/time -p'
C/C++
Las precisiones de time y /usr/bin/time no son muy buenas si quieres hacer un profiling más
serio o medir el tiempo de una parte específica del código y no de todo el programa. Para esos
casos, en Linux y FreeBSD, podemos usar la función
clock_gettime de time.h.
En /usr/include/time.h vemos: int clock_gettime(clockid_t clk_id, struct timespec *tp);
CLOCK_REALTIME: Reloj del sistema. CLOCK_MONOTONIC: CLOCK_PROCESS_CPUTIME_ID: Timer provisto
por la CPU para cada proceso. CLOCK_THREAD_CPUTIME_ID: Timer provisto por la CPU para cada thread.
#include <ctime>
timespec diff(timespec start, timespec end)
{
timespec temp;
if (end.tv_nsec - start.tv_nsec < 0)
{
temp.tv_sec = end.tv_sec - start.tv_sec-1;
temp.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec;
}
else
{
temp.tv_sec = end.tv_sec - start.tv_sec;
temp.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return temp;
}
int main()
{
timespec time1, time2;
clock_gettime(CLOCK_REALTIME, &time1);
// ... ... ...
clock_gettime(CLOCK_REALTIME, &time2);
cout << diff(time1,time2).tv_sec << ":"
<< diff(time1,time2).tv_nsec << endl;
return 0;
}
Este programa debe compilarse con g++ -lrt -o programa programa.cpp. El resultado será algo así:
julio@acer ~> ./programa
0:7674929

Soy un ingeniero informático brasileño radicado en Alemania, apasionado por la tecnología, la ciencia, la fotografía y los idiomas.
Llevo programando cerca de dos décadas, explorando desde apps móviles y desarrollo web hasta aprendizaje automático. Hoy me enfoco en SRE en la nube e ingeniería de datos.
Soy voluntario en las comunidades de open source y Python, ayudando a organizar PyCon DE y PyData Berlin, dando mentorías y contribuyendo con código y traducciones.
En mi blog comparto consejos de Linux, guías de configuración y notas personales que escribí como referencia futura. Espero que también sean útiles para otras personas. El contenido está disponible en varios idiomas.
Visita mi galería para ver algunas de mis fotografías.
Fuera del teclado, me encontrarás en conciertos, tocando el clarinete, en bicicleta, buceando o explorando nuevos lugares, culturas y cocinas.
¡Siempre feliz de conectar! 🙂