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)16static void TimeSampler_Start(TimeSample *ts) { 17 clock_gettime(CLOCK_REALTIME, &ts->startTime); 18 ts->num = 0; 19 } 20 TimeSampler_Tick(TimeSample * ts)21static void TimeSampler_Tick(TimeSample *ts) { ++ts->num; } TimeSampler_End(TimeSample * ts)22static 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)31static long long TimeSampler_DurationNS(TimeSample *ts) { 32 33 return ts->durationNS; 34 } 35 TimeSampler_DurationMS(TimeSample * ts)36static long long TimeSampler_DurationMS(TimeSample *ts) { 37 38 return ts->durationNS / 1000000; 39 } 40 TimeSampler_DurationSec(TimeSample * ts)41static double TimeSampler_DurationSec(TimeSample *ts) { 42 43 return (double)ts->durationNS / 1000000000.0; 44 } 45 TimeSampler_IterationSec(TimeSample * ts)46static 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)52static 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