diff --git a/bench/Makefile b/bench/Makefile index 76ad18bc..207e3221 100644 --- a/bench/Makefile +++ b/bench/Makefile @@ -39,7 +39,7 @@ pgo: ######################################################################### -container: bench-mlib bench-mlib-mempool bench-stl bench-qt bench-glib bench-klib bench-libdynamic bench-cmc bench-sparsepp bench-densehashmap bench-collectionc bench-tommyds bench-flathashmap bench-emilib bench-emhash bench-hopscotchmap bench-uthash bench-qlibc bench-libsrt bench-nedtries bench-rigtorp-hashmap bench-ctl bench-stc bench-pottery +container: bench-mlib bench-mlib-mempool bench-stl bench-qt bench-glib bench-klib bench-libdynamic bench-cmc bench-sparsepp bench-densehashmap bench-collectionc bench-tommyds bench-flathashmap bench-emilib bench-emhash bench-hopscotchmap bench-uthash bench-qlibc bench-libsrt bench-nedtries bench-rigtorp-hashmap bench-ctl bench-stc bench-pottery bench-CC @echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" queue: bench-mlib-thread bench-liblfds bench-concurrentqueue bench-boost bench-rigtorp-mpmc-queue @@ -388,6 +388,17 @@ bench-pottery0: @./bench-pottery.exe 41 @./bench-pottery.exe 50 +# CCLIB shall point to the source directory of CC (where the headers are) +bench-CC: + @if test -n "$${CCLIB}" ; then $(MAKE) bench-CC0 ; else echo "Nothing to be done for CC." ; fi + +bench-CC0: + $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) -I $${CCLIB}/ bench-CC.c common.c -o bench-CC.exe + @./bench-CC.exe 10 + @./bench-CC.exe 20 + @./bench-CC.exe 40 + @./bench-CC.exe 41 + ############################################################################ bench-mlib-json: bench-mlib diff --git a/bench/bench-CC.c b/bench/bench-CC.c new file mode 100644 index 00000000..493b63c3 --- /dev/null +++ b/bench/bench-CC.c @@ -0,0 +1,137 @@ +#define NDEBUG + +#include +#include +#include + +#include "common.h" + +#include "cc.h" + +/********************************************************************************************/ + +static void test_array(size_t n) +{ + vec( unsigned int ) a1, a2; + init(&a1); + init(&a2); + + for(size_t i = 0; i < n; i++) { + push(&a1, rand_get() ); + push(&a2, rand_get() ); + } + unsigned int s = 0; + for(unsigned long i = 0; i < n; i++) { + s += *get(&a1, i ) * *get(&a2, i ); + } + g_result = s; + + cleanup(&a1); + cleanup(&a2); +} + +/********************************************************************************************/ + +static void test_list(size_t n) +{ + list( unsigned int ) a1, a2; + init(&a1); + init(&a2); + + for(size_t i = 0; i < n; i++) { + push(&a1, rand_get() ); + push(&a2, rand_get() ); + } + unsigned int s = 0; + for(unsigned *it1 = first( &a1 ), *it2 = first( &a2 ); it1 != end( &a1 ); it1 = next( &a1, it1 ), it2 = next(&a2, it2) ) { + s += *it1 * *it2; + } + g_result = s; +} + +/********************************************************************************************/ + +static void +test_dict(size_t n) +{ + map( unsigned long, unsigned long ) dict; + init(&dict); + + for (size_t i = 0; i < n; i++) { + unsigned long value = rand_get(); + unsigned long key = rand_get(); + insert(&dict, key, value); + } + rand_init(); + unsigned int s = 0; + for (size_t i = 0; i < n; i++) { + unsigned long key = rand_get(); + const unsigned long *val = get(&dict, key); + if (val != NULL) + s += *val; + } + g_result = s; + + cleanup(&dict); +} + +/********************************************************************************************/ +typedef struct { + char a[256]; +} char_array_t; +static inline void char_init (char_array_t *a) { a->a[0] = 0; } +static inline void char_set (char_array_t *a, const char_array_t b) { strcpy(a->a, b.a); } +static inline bool char_equal_p (const char_array_t *a, const char_array_t *b) { return strcmp(a->a,b->a)==0; } +static inline bool char_cmp (const char_array_t *a, const char_array_t *b) { return strcmp(a->a,b->a); } +static inline void char_clear (char_array_t *a) { (void)a; } +static inline size_t char_hash(const char_array_t *a) { + size_t hash = 0; + const char *s = a->a; + while (*s) hash = hash * 31421 + (*s++) + 6927; + return hash; +} +#define CC_DTOR char_array_t, { char_clear(&val); } +#define CC_CMPR char_array_t, { return char_cmp(&val_1, &val_2); } +#define CC_HASH char_array_t, { return char_hash(&val); } +#include "cc.h" + +static void +test_dict_big(size_t n) +{ + map( char_array_t, char_array_t) dict; + init(&dict); + + for (size_t i = 0; i < n; i++) { + char_array_t s1, s2; + sprintf(s1.a, "%u", rand_get()); + sprintf(s2.a, "%u", rand_get()); + insert(&dict, s1, s2); + } + rand_init(); + unsigned int s = 0; + for (size_t i = 0; i < n; i++) { + char_array_t s1; + sprintf(s1.a, "%u", rand_get()); + const char_array_t *val = get(&dict, s1); + if (val != NULL) + s ++; + } + g_result = s; + + cleanup(&dict); +} + +/********************************************************************************************/ + +const config_func_t table[] = { + { 10, "List", 10000000, 0, test_list, 0}, + { 20, "Array", 100000000, 0, test_array, 0}, + { 40, "dict", 1000000, 0, test_dict, 0}, + { 41, "dictBig", 1000000, 0, test_dict_big, 0}, +}; + +int main(int argc, const char *argv[]) +{ + test("CC", numberof(table), table, argc, argv); + exit(0); +}