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

I’m a Brazilian computer engineer based in Germany, passionate about tech, science, photography, and languages.
I’ve been programming for about two decades already, exploring everything from mobile apps and web development to machine learning. These days I focus on cloud SRE and data engineering.
I volunteer in the open source and Python communities, helping organize PyCon DE and PyData Berlin, mentoring, and contributing with code and translations.
On my blog, I share Linux tips, setup guides, and personal notes I’ve written for future reference. I hope others find them helpful as well. The content is available in multiple languages.
Browse my gallery for some of my photography.
Away from the keyboard, you’ll find me at concerts, playing clarinet, cycling, scuba diving, or exploring new places, cultures, and cuisines.
Always happy to connect! 🙂