Calculate Execution Time
In ZSH:
julio@acer ~> time ./program
Hello World!
./program 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++
The precision of time
and /usr/bin/time
is not very good if you want to do serious profiling
or want to check the time spent by a specific part of the code and not the whole program. For these
cases, on Linux and FreeBSD, we can use the function
clock_gettime from time.h.
Looking at the file /usr/include/time.h
int clock_gettime(clockid_t clk_id, struct timespec *tp);
CLOCK_REALTIME
: System clock. CLOCK_MONOTONIC
: CLOCK_PROCESS_CPUTIME_ID
: Timer provided by the
CPU to each process. CLOCK_THREAD_CPUTIME_ID
: Timer provided by the CPU to each 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;
}
This program should be compiled using g++ -lrt -o program program.cpp
, the result will be
something like this:
julio@acer ~> ./program
0:7674929