What time is it?

There are several functions that you can use to determine the current time, for use in timestamps or for calculating execution times:

time()
This is the fastest generic time function we have. It's fast because it just reads from the qtime entries from the system page (see SYSPAGE_ENTRY() ).
ClockTime()
The kernel call for time functions. Using CLOCK_MONOTONIC is typically better than using CLOCK_REALTIME because the monotonic clock is always increasing, so you don't have to worry that someone might be changing the clock. Changing the realtime clock just modifies SYSPAGE_ENTRY(qtime)->nsec_tod_adjust to be the difference between the monotonic and realtime clocks.
clock_gettime()
A POSIX cover function for ClockTime().

All the above methods have an accuracy based on the system timer tick. If you need more accuracy, you can use ClockCycles() . This function is implemented differently for each processor, so there are tradeoffs. The implementation tries to be as quick as possible, so it tries to use a CPU register if possible. Because of this, to get accurate times on SMP machines, you need to use thread affinity to lock the thread to a processor, because each processor can have a ClockCycles() base value that may not be synchronized with the values on other processors.

Some caveats for each processor:

x86
Reads from a 64-bit register, except for 486s, where it causes a fault and the fault handler reads from an external clock chip.
ARM
Always faults, and the fault handler reads from an external clock chip to make a 64-bit value.

To convert the cycle number to real time, use SYSPAGE_ENTRY(qtime)->cycles_per_sec.

If you need a pause, use delay() or the POSIX clock_nanosleep() .

If you need a very short delay (that is, for accessing hardware), you should look at the nanospin*() functions:

They basically do a while loop to a calibrated number of iterations to delay the proper amount of time. This wastes CPU, so you should use these functions only if necessary.