From 6fe1fbd7cb7635025b4ba2547d210e86c5d4c2ea Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sat, 22 Jul 2017 00:13:43 +0200 Subject: [PATCH] Add bench for hashtable of CollectionsC but expected results are incorrect. Need to check if there is a bug in the bench. --- bench/Makefile | 2 + bench/bench-collectionc.c | 106 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/bench/Makefile b/bench/Makefile index 8080842e..8b9321e7 100644 --- a/bench/Makefile +++ b/bench/Makefile @@ -107,6 +107,8 @@ bench-collectionc0: @./bench-collectionc.exe 10 @./bench-collectionc.exe 20 @./bench-collectionc.exe 30 + @./bench-collectionc.exe 40 + @./bench-collectionc.exe 41 bench-plain: $(CC) $(CFLAGS) $(CPPFLAGS) bench-plain-c.c -o bench-plain-c.exe diff --git a/bench/bench-collectionc.c b/bench/bench-collectionc.c index 7eb1f8bc..2da37d37 100644 --- a/bench/bench-collectionc.c +++ b/bench/bench-collectionc.c @@ -10,6 +10,7 @@ #include "array.h" #include "slist.h" #include "treetable.h" +#include "hashtable.h" #include "common.h" @@ -112,6 +113,107 @@ static void test_rbtree(size_t n) treetable_destroy(tree); } +/********************************************************************************************/ +static size_t hash_func (const void *key, int l, uint32_t seed) +{ + const unsigned long pa = (uintptr_t) key; + (void)l; + return pa ^ seed; +} + +static int equal_func(const void *key1, const void *key2) +{ + const unsigned long pa = (uintptr_t) key1; + const unsigned long pb = (uintptr_t) key2; + return pa == pb; +} + +static void +test_dict(unsigned long n) +{ + HashTable *dict; + enum cc_stat stat; + HashTableConf htc; + hashtable_conf_init(&htc); + htc.hash = hash_func; + htc.key_compare = equal_func; + stat = hashtable_new_conf(&htc, &dict); + if (stat != CC_OK) abort(); + + for (size_t i = 0; i < n; i++) { + void *key = (void*)(uintptr_t) rand_get(); + void *value = (void*)(uintptr_t) rand_get(); + stat = hashtable_add(dict, key, value ); + if (stat != CC_OK) abort(); + } + rand_init(); + unsigned int s = 0; + for (size_t i = 0; i < n; i++) { + void *key = (void*)(uintptr_t) rand_get(); + void *r; + stat = hashtable_get(dict, key, &r); + if (stat == CC_OK) + s += (uintptr_t) r; + } + g_result = s; + hashtable_destroy(dict); +} + +/********************************************************************************************/ + +typedef char char_array_t[256]; + +static int char_equal (const void* a, const void * b) +{ + const char_array_t *pa = (const char_array_t *)a; + const char_array_t *pb = (const char_array_t *)b; + return strcmp(*pa,*pb)==0; +} + +static size_t char_hash(const void *a, int l, uint32_t seed) +{ + const char_array_t *pa = (const char_array_t *)a; + const char *s = *pa; + (void)l ; + size_t hash = seed; + while (*s) hash = hash * 31421 + (*s++) + 6927; + return hash; +} + +static void +test_dict_big(unsigned long n) +{ + HashTable *dict; + enum cc_stat stat; + HashTableConf htc; + hashtable_conf_init(&htc); + htc.hash = char_hash; + htc.key_compare = char_equal; + stat = hashtable_new_conf(&htc, &dict); + if (stat != CC_OK) abort(); + + for (size_t i = 0; i < n; i++) { + char_array_t *key = malloc (sizeof (char_array_t)); + char_array_t *value = malloc (sizeof (char_array_t)); + sprintf(*key, "%u", rand_get()); + sprintf(*value, "%u", rand_get()); + stat = hashtable_add(dict, key, value ); + if (stat != CC_OK) abort(); + } + rand_init(); + unsigned int s = 0; + for (size_t i = 0; i < n; i++) { + char_array_t s1; + void *r; + sprintf(s1, "%u", rand_get()); + stat = hashtable_get(dict, s1, &r); + if (stat == CC_OK) + s ++; + } + g_result = s; + hashtable_destroy(dict); +} + /********************************************************************************************/ int main(int argc, const char *argv[]) @@ -123,6 +225,10 @@ int main(int argc, const char *argv[]) test_function("Array time", 100000000, test_array); if (n == 30) test_function("Rbtree time", 1000000, test_rbtree); + if (n == 40) + test_function("Dict time", 1000000, test_dict); + if (n == 41) + test_function("DictB time", 1000000, test_dict_big); exit(0); }