Microsecond accurate (or better) process timing in Linux
If you are looking for this level of timing resolution, you are probably trying to do some micro-optimization. If that's the case, you should look at PAPI. Not only does it provide both wall-clock and virtual (process only) timing information, it also provides access to CPU event counters, which can be indispensable when you are trying to improve performance.
http://icl.cs.utk.edu/papi/
Is the UNIX `time` command accurate enough for benchmarks?
time
produces good enough times for benchmarks that run over one second otherwise the time it took exec()
ing a process may be large compared to its run-time.
However, when benchmarking you should watch out for context switching. That is, another process may be using CPU thus contending for CPU with your benchmark and increasing its run time. To avoid contention with other processes you should run a benchmark like this:
sudo chrt -f 99 /usr/bin/time --verbose <benchmark>
Or
sudo chrt -f 99 perf stat -ddd <benchmark>
sudo chrt -f 99
runs your benchmark in FIFO real-time class with priority 99, which makes your process the top priority process and avoids context switching (you can change your /etc/security/limits.conf
so that it doesn't require a privileged process to use real-time priorities).
It also makes time
report all the available stats, including the number of context switches your benchmark incurred, which should normally be 0, otherwise you may like to rerun the benchmark.
perf stat -ddd
is even more informative than /usr/bin/time
and displays such information as instructions-per-cycle, branch and cache misses, etc.
And it is better to disable the CPU frequency scaling and boost, so that the CPU frequency stays constant during the benchmark to get consistent results.
Command to get time in milliseconds
date +%s%N
returns the number of seconds + current nanoseconds.
Therefore, echo $(($(date +%s%N)/1000000))
is what you need.
Example:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
returns the number of seconds since the epoch, if that's useful.
How accurate is the Linux bash time command?
The man 1 time is rather clear:
These statistics consist of (i) the elapsed real time between
invocation and termination, (ii) the user CPU time (the sum of the tms_utime and tms_cutime values in a struct tms as returned by
times(2)), and (iii) the system CPU time (the sum of the tms_stime and tms_cstime values in a struct tms as returned by
times(2)).
So we can go to man 3p times where is just states The accuracy of the times reported is intentionally left unspecified to allow implementations flexibility in design, from uniprocessor to multi-processor networks.
So we can go to man 2 times, and learn that it's all measured with clock_t
and maybe we should use clock_gettime
instead
How do I know what clock source time uses?
As usually on a GNU system, all programs are open source. So you go and download sources of the kernel and you shell and inspect them to see how it works. I see in bash time_command() there are many methods available and nowadays bash uses rusage as a replacement for times
.
How accurate is the Linux bash time command?
Both getrusage()
and times()
are system calls by themselfs, so the values are returned straight from the kernel. My guess would be that they are measured with the accuracy the kernel can give us - so with jiffies/HZ
.
The resolution of the measurement will be equal to jiffies, so usually with 300 HZ thats 3.333ms if my math is right. The accuracy will depend on your hardware, maybe also workload - my overestimated guess would be that the values will be right up to one or two jiffies of accuracy, so up to ~7 milliseconds.
Getting millisecond or microsecond-accurate boot time in Linux (C/C++)
Use clock_gettime(CLOCK_BOOTTIME, &ts).
How to print time difference in accuracy of milliseconds and nanoseconds from C in Linux?
Read first the time(7) man page.
Then, you can use clock_gettime(2) syscall (you may need to link -lrt
to get it).
So you could try
struct timespec tstart={0,0}, tend={0,0};
clock_gettime(CLOCK_MONOTONIC, &tstart);
some_long_computation();
clock_gettime(CLOCK_MONOTONIC, &tend);
printf("some_long_computation took about %.5f seconds\n",
((double)tend.tv_sec + 1.0e-9*tend.tv_nsec) -
((double)tstart.tv_sec + 1.0e-9*tstart.tv_nsec));
Don't expect the hardware timers to have a nanosecond accuracy, even if they give a nanosecond resolution. And don't try to measure time durations less than several milliseconds: the hardware is not faithful enough. You may also want to use clock_getres
to query the resolution of some clock.
Linux' hrtimer - microsecond precision?
You can do what you want from user space
- use
clock_gettime()
withCLOCK_REALTIME
to get the time-of-day withnano
-second resolution - use
nanosleep()
to yield the CPU until you are close to the time you need to execute your task (it is at leastmilli
-second resolution). - use a spin loop with
clock_gettime()
until you reach the desired time - execute your task
The clock_gettime()
function is implemented as a VDSO
in recent kernels and modern x86 processors - it takes 20-30 nano
seconds to get the time-of-day with nano
-second resolution - you should be able to call clock_gettime()
over 30 times per micro
-second. Using this method your task should dispatch within 1/30th of a micro
-second of the intended time.
Related Topics
How to Decode /Proc/Pid/Pagemap Entries in Linux
What Is Path //, How Is It Different from /
Should I Use Libc++ or Libstdc++
How to Check If X Server Is Running
Does Gcc Have Any Options to Add Version Info in Elf Binary File
Changing Environment Variable of a Running Process
How to Detect the Physical Connected State of a Network Cable/Connector
Makefile That Distinguishes Between Windows and Unix-Like Systems
How to Portably Extend a File Accessed Using Mmap()
Sending Udp Packets from the Linux Kernel
Multiple Websites on Nginx & Sites-Available
Bash Capturing Output of Awk into Array
How to Undo Strip - I.E. Add Symbols Back to Stripped Binary
Sort Not Sorting as Expected (Space and Locale)