High precision time? (Micro, possibly nanoseconds)

I’m trying to measure how long it takes for my program to go through a certain function. Currently it looks something like this:

void function {
int start_s = clock();
//code here
int stop_s = clock();
double time = (stop_s-start_s)/double (CLOCKS_PER_SEC)*1000;
cout << ... endl;

however this is millisecond precision only, I’d need micro, but possibly nanoseconds. I cannot use chrono, as it’s part of C++11, and I’d need something that works with C++98.

any ideas?
thanks :slight_smile:

if you’re POSIX, then, clock_gettime(3) and timespec (from <time.h>) should provide the needed precision:

int clock_gettime(clockid_t clk_id, struct timespec *tp);

struct timespec {
        time_t   tv_sec;        /* seconds */
        long     tv_nsec;       /* nanoseconds */
};

hth,
-s

Hi lawlieto,
being limited to c++98 in 2017 sounds indeed painful.
Note however that the resolution of clock depends on your system, not on the c++ standard used: in particular resolution depends on the value of CLOCKS_PER_SEC.

If you post here you are probably looking for a ROOT solution. Unfortunately ROOT 6 requires at least c++11.
So this leaves us with ROOT5. The only facility I know of is TStopWatch but the docs do not say anything about its resolution (results are returned in seconds, as a double).

A different approach might be executing the function you want to time N times and then divide the measured time by N. This is always a better approach as it also averages over fluctuations of the runtime due to factors external to your function, and in principle yields arbitrary precision in the measurement.

Cheers,
Enrico

TStopwatch uses the libc function times which has CLK_TCK resolution.

hi eguiraud,

thanks :slight_smile: it seems that the highest precision you can get with TStopWatch is microseconds. I downloaded the softwares I need from our remote server where I work and I’m installing them (will take some time) and then I’ll just use a system profiler on my laptop, which should be accurate.

thanks, unfortunately it doesn’t seem to work on my macbook, but I solved the issue by downloading the softwares I need from our remote server, and I’ll be using a system profiler. :slight_smile:

The real suggestion was to execute the workload N times and then divide the measured time by N :stuck_out_tongue:

In any case if you found what you were looking for you can pick an answer and mark it as a solution for the thread :smiley:

I was planning to plot a histogram from the run times (the function was called around 10000 + times). Anyway, i’ll choose your post :stuck_out_tongue: Thanks :slight_smile: