Skip to content

Instantly share code, notes, and snippets.

@Prince781
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Prince781/094f09193c48168f7aaf to your computer and use it in GitHub Desktop.
Save Prince781/094f09193c48168f7aaf to your computer and use it in GitHub Desktop.
Small benchmark suite for Data Structures homework.
#ifndef _PROB_BENCHMARK_H_
#define _PROB_BENCHMARK_H_
#define _GNU_SOURCE
#include <stdio.h>
#include <time.h>
#define KNRM "\x1B[0m" // normal console color
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define KYEL "\x1B[33m"
#define KBLU "\x1B[34m"
#define KMAG "\x1B[35m"
#define KCYN "\x1B[36m"
#define KWHT "\x1B[37m"
#define KRST "\033[0m" // resets to previous console color
#ifndef abs
# define abs(n) (n) < 0 ? -(n) : (n)
#endif
#define BENCHMARK_TIMES_FEW 1000u
#define BENCHMARK_TIMES_NORM BENCHMARK_TIMES_FEW*1000u
#define BENCHMARK_TIMES_MANY BENCHMARK_TIMES_NORM*10u
/*
* Use: run benchmark_flip() with just the function pointer flip as your
* argument.
*/
#define benchmark_flip(func,times) \
do {\
unsigned n;\
double avg, err;\
struct timespec start, end;\
printf(KBLU"benchmark:"KRST" running flip() %u times\n", times);\
clock_gettime(CLOCK_MONOTONIC, &start);\
for (n=0, avg=0; n<times; avg /= ++n)\
avg = n*avg + func();\
clock_gettime(CLOCK_MONOTONIC, &end);\
err = abs(100*(avg-0.5)/0.5);\
printf("\tE(X) = %lf (expected: %lf, error: "\
"%s%f%%"KRST") (time: %lf sec)\n", avg, 0.5,\
err > 5?(err > 50 ? KRED : KYEL):KGRN,\
abs(100*(avg-0.5)/0.5), (end.tv_sec - start.tv_sec)\
+ (double)(end.tv_nsec - start.tv_nsec) / 1000000000ul);\
} while (0)
/* Use: test low, mid, high benchmarks on function */
#define benchmark_flip_test(func)\
do {\
benchmark_flip(func,BENCHMARK_TIMES_FEW);\
benchmark_flip(func,BENCHMARK_TIMES_NORM);\
benchmark_flip(func,BENCHMARK_TIMES_MANY);\
} while (0)
/*
* Use: run benchmark_flop() with flop as func, and (a,b) as (m,n).
*/
#define benchmark_flop(func,a,b,times) \
do {\
unsigned n;\
double avg, err;\
double e = (double)a/b;\
struct timespec start, end;\
printf(KBLU"benchmark:"KRST" running flop(%d,%d) (p=%lf) %u times\n",\
a, b, e, times);\
clock_gettime(CLOCK_MONOTONIC, &start);\
for (n=0, avg; n<times; avg /= ++n)\
avg = n*avg + func(a,b);\
clock_gettime(CLOCK_MONOTONIC, &end);\
err = e == 0 ? 0 : abs(100*(avg-e)/e);\
printf("\tE(X) = %lf (expected: %lf, error: "\
"%s%f%%"KRST") (time: %lf sec)\n", avg, e,\
err > 5?(err > 50 ? KRED : KYEL):KGRN,err,\
(end.tv_sec - start.tv_sec)\
+ (double)(end.tv_nsec - start.tv_nsec) / 1000000000ul);\
} while (0)
/* Use: test low, mid, high benchmarks on function */
#define benchmark_flop_test(func,a,b)\
do {\
benchmark_flop(func,a,b,BENCHMARK_TIMES_FEW);\
benchmark_flop(func,a,b,BENCHMARK_TIMES_NORM);\
benchmark_flop(func,a,b,BENCHMARK_TIMES_MANY);\
} while (0)
#define benchmark_flop_test_all_p(func)\
do {\
int num;\
printf(KBLU"meta benchmark:"\
KRST" testing flop() for 100 p in [0,1]\n");\
for (num=0; num<100; ++num)\
benchmark_flop(func,num,100,BENCHMARK_TIMES_FEW);\
} while (0)
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment