diff --git a/benchmarks/CSSBenchmark.h b/benchmarks/CSSBenchmark.h index fdb0f5eb..cbec6008 100644 --- a/benchmarks/CSSBenchmark.h +++ b/benchmarks/CSSBenchmark.h @@ -9,6 +9,7 @@ #pragma once +#include #include #include #include @@ -19,7 +20,7 @@ #define CSS_BENCHMARKS(BLOCK) \ int main(int argc, char const *argv[]) { \ clock_t __start; \ - clock_t __end; \ + clock_t __endTimes[NUM_REPETITIONS]; \ { BLOCK } \ return 0; \ } @@ -27,15 +28,47 @@ #define CSS_BENCHMARK(NAME, BLOCK) \ __start = clock(); \ for (uint32_t __i = 0; __i < NUM_REPETITIONS; __i++) { \ - BLOCK \ + { BLOCK } \ + __endTimes[__i] = clock(); \ } \ - __end = clock(); \ - __printBenchmarkResult(NAME, __start, __end); + __printBenchmarkResult(NAME, __start, __endTimes); -void __printBenchmarkResult(char *name, clock_t start, clock_t end) { - float total = (end - start) / (double)CLOCKS_PER_SEC * 1000; - float mean = total / NUM_REPETITIONS; - printf("%s: ", name); - printf("%lf ms", mean); - printf("\n"); + +int __compareDoubles(const void* a, const void* b) { + double arg1 = *(const double*)a; + double arg2 = *(const double*)b; + + if (arg1 < arg2) { + return -1; + } + + if (arg1 > arg2) { + return 1; + } + + return 0; +} + +void __printBenchmarkResult(char *name, clock_t start, clock_t *endTimes) { + double timesInMs[NUM_REPETITIONS]; + double mean = 0; + clock_t lastEnd = start; + for (uint32_t i = 0; i < NUM_REPETITIONS; i++) { + timesInMs[i] = (endTimes[i] - lastEnd) / (double)CLOCKS_PER_SEC * 1000; + lastEnd = endTimes[i]; + mean += timesInMs[i]; + } + mean /= NUM_REPETITIONS; + + qsort(timesInMs, NUM_REPETITIONS, sizeof(double), __compareDoubles); + double median = timesInMs[NUM_REPETITIONS / 2]; + + double variance = 0; + for (uint32_t i = 0; i < NUM_REPETITIONS; i++) { + variance += pow(timesInMs[i] - mean, 2); + } + variance /= NUM_REPETITIONS; + double stddev = sqrt(variance); + + printf("%s: median: %lf ms, stddev: %lf ms\n", name, median, stddev); }