From d125911894a6f0426946c0fd0223a7948390ff06 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Fri, 12 Aug 2016 06:17:36 -0700 Subject: [PATCH] Print more detailed benchmark results including median and stddev Summary: Mean was previously printed just because it was the quickest. Median is a better measurement and we need to include stddev for the sake of comparison against previous diff. Differential Revision: D3709165 fbshipit-source-id: 67aff0877192143df82a9c24cbedb1f49616eec7 --- benchmarks/CSSBenchmark.h | 53 +++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 10 deletions(-) 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); }