1 #ifndef __RL_TIME_SAMPLE__
2 #define __RL_TIME_SAMPLE__
3 
4 #include <sys/time.h>
5 #include <stdio.h>
6 #include <sys/time.h>
7 #include <time.h>
8 
9 typedef struct {
10   struct timespec startTime;
11   struct timespec endTime;
12   long long durationNS;
13   int num;
14 } TimeSample;
15 
TimeSampler_Start(TimeSample * ts)16 static void TimeSampler_Start(TimeSample *ts) {
17   clock_gettime(CLOCK_REALTIME, &ts->startTime);
18   ts->num = 0;
19 }
20 
TimeSampler_Tick(TimeSample * ts)21 static void TimeSampler_Tick(TimeSample *ts) { ++ts->num; }
TimeSampler_End(TimeSample * ts)22 static void TimeSampler_End(TimeSample *ts) {
23 
24   clock_gettime(CLOCK_REALTIME, &ts->endTime);
25 
26   ts->durationNS =
27       ((long long)1000000000 * ts->endTime.tv_sec + ts->endTime.tv_nsec) -
28       ((long long)1000000000 * ts->startTime.tv_sec + ts->startTime.tv_nsec);
29 }
30 
TimeSampler_DurationNS(TimeSample * ts)31 static long long TimeSampler_DurationNS(TimeSample *ts) {
32 
33   return ts->durationNS;
34 }
35 
TimeSampler_DurationMS(TimeSample * ts)36 static long long TimeSampler_DurationMS(TimeSample *ts) {
37 
38   return ts->durationNS / 1000000;
39 }
40 
TimeSampler_DurationSec(TimeSample * ts)41 static double TimeSampler_DurationSec(TimeSample *ts) {
42 
43   return (double)ts->durationNS / 1000000000.0;
44 }
45 
TimeSampler_IterationSec(TimeSample * ts)46 static double TimeSampler_IterationSec(TimeSample *ts) {
47 
48   return ((double)ts->durationNS / 1000000000.0) /
49          (double)(ts->num ? ts->num : 1.0);
50 }
51 
TimeSampler_IterationMS(TimeSample * ts)52 static double TimeSampler_IterationMS(TimeSample *ts) {
53 
54   return ((double)ts->durationNS / 1000000.0) /
55          (double)(ts->num ? ts->num : 1.0);
56 }
57 
58 #define TIME_SAMPLE_RUN(blk)                                                   \
59   {                                                                            \
60     TimeSample ts;                                                             \
61     TimeSampler_Start(&ts);                                                    \
62     { blk; };                                                                  \
63     TimeSampler_End(&ts);                                                      \
64     printf("Execution time for " #blk ": %f seconds\n",                        \
65            TimeSampler_DurationSec(&ts));                                      \
66   }
67 
68 #define TIME_SAMPLE_RUN_LOOP(N, blk)                                           \
69   {                                                                            \
70     TimeSample ts;                                                             \
71     TimeSampler_Start(&ts);                                                    \
72     for (int __ts_loop = 0; __ts_loop < N; __ts_loop++) {                      \
73       blk;                                                                     \
74       TimeSampler_Tick(&ts);                                                   \
75     };                                                                         \
76     TimeSampler_End(&ts);                                                      \
77     printf("Execution time for %d iterations of " #blk                         \
78            ": %f msec/iteration\n",                                         \
79            ts.num, TimeSampler_IterationMS(&ts));                             \
80   }
81 
82 #endif