From 7b11f5afbc7ef459f2417612a54bd84fffa5183a Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sat, 28 Apr 2018 19:44:52 +0200 Subject: [PATCH] Add benchmark UDB --- bench/udb/Makefile | 53 +++++++++++++++++++++++++++ bench/udb/Makefile-mlib | 22 ++++++++++++ bench/udb/test-mlib-oa.c | 78 ++++++++++++++++++++++++++++++++++++++++ bench/udb/test-mlib.c | 53 +++++++++++++++++++++++++++ 4 files changed, 206 insertions(+) create mode 100644 bench/udb/Makefile create mode 100644 bench/udb/Makefile-mlib create mode 100644 bench/udb/test-mlib-oa.c create mode 100644 bench/udb/test-mlib.c diff --git a/bench/udb/Makefile b/bench/udb/Makefile new file mode 100644 index 00000000..8ec3614d --- /dev/null +++ b/bench/udb/Makefile @@ -0,0 +1,53 @@ +CC= gcc +CXX= g++ +CFLAGS= -g -Wall -O2 -fomit-frame-pointer -march=native -lm -include stddef.h +CXXFLAGS= $(CFLAGS) +LDFLAGS= +OBJS= +LIBS= -lm + +all: run + +benchmarks: + git clone https://github.com/attractivechaos/benchmarks.git + +build: benchmarks + mkdir -p benchmarks/udb/mlib + cp test-mlib.c benchmarks/udb/mlib/test.c + cp Makefile-mlib benchmarks/udb/mlib/Makefile + mkdir -p benchmarks/udb/mlib-oa + cp test-mlib-oa.c benchmarks/udb/mlib-oa/test.c + cp Makefile-mlib benchmarks/udb/mlib-oa/Makefile + touch build + +all-recur: build + cd benchmarks/udb; \ + wdir=`pwd`; \ + list_c=`find . -name 'test.c'`; \ + list_cc=`find . -name 'test.cc'`; \ + for t in $$list_c $$list_cc ; do \ + subdir=`dirname $$t`; \ + cd $$subdir; \ + $(MAKE) CC="$(CC)" CXX="$(CXX)" DFLAGS="$(DFLAGS)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" || exit 1; \ + cd $$wdir; \ + done; + +run: all-recur + @cd benchmarks/udb; \ + echo ; echo "LIBRARY | INT TIME | STR TIME" ; \ + for i in `find . -name 'test'` ; do \ + printf "%s|" `dirname $$i|sed -e 's+./++g'`; \ + $$i -is | awk ' \ + /\[int data\] # element/ { nbInt= $$5 } \ + /\[int data\] CPU time/ {timeInt= $$5 } \ + /\[str data\] # element/ { nbStr= $$5 } \ + /\[str data\] CPU time/ {timeStr= $$5 } \ + END { \ + if (nbInt != 624444) timeInt="BRK" ; \ + if (nbStr != 624444) timeStr="BRK" ; \ + print timeInt,"|" ,timeStr \ + }' ; \ + done + +clean: + rm -rf benchmarks build diff --git a/bench/udb/Makefile-mlib b/bench/udb/Makefile-mlib new file mode 100644 index 00000000..8c359828 --- /dev/null +++ b/bench/udb/Makefile-mlib @@ -0,0 +1,22 @@ +CC= gcc +CFLAGS= -g -Wall -O2 -march=native +OBJS= ../benchmark/benchmark.o ../runit/runlib.o test.o +DFLAGS= +INCLUDES= -I../benchmark -I../runit -I../../../../.. +LIBS= + +.SUFFIXES:.c .o + +.c.o: + $(CC) -std=gnu11 -DNDEBUG -c $(INCLUDES) $(CFLAGS) $(DFLAGS) $< -o $@ + +all:test + +test:$(OBJS) + $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) + +cleanlocal: + rm -f *.o a.out *~ test + +clean:cleanlocal + diff --git a/bench/udb/test-mlib-oa.c b/bench/udb/test-mlib-oa.c new file mode 100644 index 00000000..5754a96b --- /dev/null +++ b/bench/udb/test-mlib-oa.c @@ -0,0 +1,78 @@ +#ifndef NDEBUG +#define NDEBUG +#endif +#undef NDEBUG + +#include + +#include "benchmark.h" +#include "m-dict.h" +#include "m-mempool.h" + +static inline bool oor_equal_p(int k, unsigned char n) +{ + return k == (int)-n - 1; +} + +static inline void oor_set(int *k, unsigned char n) +{ + *k = (int)-n - 1; +} + +DICT_OA_DEF2(dict_int, + int, M_OPEXTEND(M_DEFAULT_OPLIST, OOR_EQUAL(oor_equal_p), OOR_SET(oor_set M_IPTR)), + int, M_DEFAULT_OPLIST) + +static const char *const oor[2] = { "EMPTY", "DELETED" }; + +static inline bool str_oor_equal_p(const char *k, unsigned char n) +{ +return k == oor[n]; +} + +static inline void str_oor_set(const char * *k, unsigned char n) +{ +*k = oor[n]; +} + +DICT_OA_DEF2(dict_str, const char *, + M_OPEXTEND (M_CSTR_OPLIST, OOR_EQUAL(str_oor_equal_p), OOR_SET(str_oor_set M_IPTR)), + int, M_DEFAULT_OPLIST) + + +int test_int(int N, const unsigned *data) +{ + int ret; + M_LET(h, DICT_OPLIST(dict_int)) { + for (int i = 0; i < N; ++i) { + if (dict_int_get (h, data[i]) == NULL) { + dict_int_set_at (h, data[i], i); + } else { + dict_int_remove(h, data[i]); + } + } + ret = (int)dict_int_size(h); + } + return ret; +} + +int test_str(int N, char * const *data) +{ + int ret; + M_LET(h, DICT_OPLIST(dict_str)) { + for (int i = 0; i < N; ++i) { + if (dict_str_get (h, data[i]) == NULL) { + dict_str_set_at (h, data[i], i); + } else { + dict_str_remove(h, data[i]); + } + } + ret = (int)dict_str_size(h); + } + return ret; +} + +int main(int argc, char *argv[]) +{ + return udb_benchmark(argc, argv, test_int, test_str); +} diff --git a/bench/udb/test-mlib.c b/bench/udb/test-mlib.c new file mode 100644 index 00000000..cb6406f7 --- /dev/null +++ b/bench/udb/test-mlib.c @@ -0,0 +1,53 @@ +#include + +#include "benchmark.h" +#include "m-dict.h" +#include "m-mempool.h" + +DICT_DEF2(dict_int, + int, M_OPEXTEND(M_DEFAULT_OPLIST, MEMPOOL(mpool_int), MEMPOOL_LINKAGE(static)), + int, M_DEFAULT_OPLIST) +DICT_DEF2(dict_str, + const char *, M_OPEXTEND (M_CSTR_OPLIST, MEMPOOL(mpool_str), MEMPOOL_LINKAGE(static)), + int, M_DEFAULT_OPLIST) + +int test_int(int N, const unsigned *data) +{ + int ret; + dict_int_list_pair_mempool_init(mpool_int); + M_LET(h, DICT_OPLIST(dict_int)) { + for (int i = 0; i < N; ++i) { + if (dict_int_get (h, data[i]) == NULL) { + dict_int_set_at (h, data[i], i); + } else { + dict_int_remove(h, data[i]); + } + } + ret = (int)dict_int_size(h); + } + dict_int_list_pair_mempool_clear(mpool_int); + return ret; +} + +int test_str(int N, char * const *data) +{ + int ret; + dict_str_list_pair_mempool_init(mpool_str); + M_LET(h, DICT_OPLIST(dict_str)) { + for (int i = 0; i < N; ++i) { + if (dict_str_get (h, data[i]) == NULL) { + dict_str_set_at (h, data[i], i); + } else { + dict_str_remove(h, data[i]); + } + } + ret = (int)dict_str_size(h); + } + dict_str_list_pair_mempool_clear(mpool_str); + return ret; +} + +int main(int argc, char *argv[]) +{ + return udb_benchmark(argc, argv, test_int, test_str); +}