diff --git a/bench/Makefile b/bench/Makefile index 0a65e85a..76f84394 100644 --- a/bench/Makefile +++ b/bench/Makefile @@ -351,6 +351,20 @@ bench-ctl0: @./bench-ctl.exe 40 @./bench-ctl.exe 50 +# STC shall point to the source directory (not where the headers are) +bench-stc: + @if test -n "$${STC}" ; then $(MAKE) bench-stc0 ; else echo "Nothing to be done for STC." ; fi + +bench-stc0: + $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) -I $${STC}/include bench-stc.c common.c -o bench-stc.exe + @./bench-stc.exe 10 + @./bench-stc.exe 20 + @./bench-stc.exe 30 + @./bench-stc.exe 40 + @./bench-stc.exe 41 + @./bench-stc.exe 50 + + ############################################################################ bench-mlib-json: bench-mlib diff --git a/bench/bench-stc.c b/bench/bench-stc.c new file mode 100644 index 00000000..9b1e8b15 --- /dev/null +++ b/bench/bench-stc.c @@ -0,0 +1,194 @@ +#define NDEBUG + +#include +#include +#include + +#include "common.h" + +/********************************************************************************************/ + +#define i_val unsigned int +#define i_tag uint +#include + +static void test_array(size_t n) +{ + cvec_uint a1 = cvec_uint_init(), a2 = cvec_uint_init(); + + for(size_t i = 0; i < n; i++) { + cvec_uint_push_back(&a1, rand_get() ); + cvec_uint_push_back(&a2, rand_get() ); + } + unsigned int s = 0; + for(unsigned long i = 0; i < n; i++) { + s += *cvec_uint_at(&a1, i ) * *cvec_uint_at(&a2, i ); + } + g_result = s; + + cvec_uint_drop(&a1); + cvec_uint_drop(&a2); +} + +/********************************************************************************************/ +#define i_val unsigned int +#define i_tag uint +#include + +static void test_list(size_t n) +{ + clist_uint a1 = clist_uint_init(), a2 = clist_uint_init(); + + for(size_t i = 0; i < n; i++) { + clist_uint_push_front(&a1, rand_get() ); + clist_uint_push_front(&a2, rand_get() ); + } + unsigned int s = 0; + for(clist_uint_iter it1 = clist_uint_begin(&a1), it2 = clist_uint_begin(&a2) ; + it1.ref != clist_uint_end(&a1).ref ; + clist_uint_next(&it1), clist_uint_next(&it2) ) { + s += *it1.ref * *it2.ref; + } + g_result = s; + + clist_uint_drop(&a1); + clist_uint_drop(&a2); +} + +/********************************************************************************************/ + +#define i_tag ulong +#define i_key unsigned long +#include + +static void test_rbtree(size_t n) +{ + csset_ulong tree = csset_ulong_init(); + + for (size_t i = 0; i < n; i++) { + csset_ulong_insert(&tree, rand_get() ); + } + + rand_init(); + unsigned int s = 0; + for (size_t i = 0; i < n; i++) { + unsigned long j = rand_get(); + if (csset_ulong_get(&tree, j ) != NULL) + s+= j; + } + g_result = s; + csset_ulong_drop(&tree); +} + +/********************************************************************************************/ + +#define i_tag ulong +#define i_key unsigned long +#define i_val unsigned long +#include + +static void +test_dict(size_t n) +{ + cmap_ulong dict = cmap_ulong_init(); + + for (size_t i = 0; i < n; i++) { + unsigned long value = rand_get(); + unsigned long key = rand_get(); + cmap_ulong_put(&dict, key, value); + } + rand_init(); + unsigned int s = 0; + for (size_t i = 0; i < n; i++) { + const cmap_ulong_value*val = cmap_ulong_get(&dict, rand_get()); + if (val != NULL) + s += val->second; + } + g_result = s; + + cmap_ulong_drop(&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 void char_clear (char_array_t *a) { (void)a; } +static inline size_t char_hash(const char_array_t *a, size_t size) { + (void) size; + size_t hash = 0; + const char *s = a->a; + while (*s) hash = hash * 31421 + (*s++) + 6927; + return hash; +} + +#define i_tag achar +#define i_key char_array_t +#define i_val char_array_t +#define i_hash char_hash +#define i_eq char_equal_p +#include + +static void +test_dict_big(size_t n) +{ + cmap_achar dict = cmap_achar_init(); + + 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()); + cmap_achar_put(&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 cmap_achar_value*val = cmap_achar_get(&dict, s1); + if (val != NULL) + s ++; + } + g_result = s; + + cmap_achar_drop(&dict); +} + +/********************************************************************************************/ + +#define i_val float +#define i_tag float +#include + +static void test_sort(size_t n) +{ + cvec_float a1 = cvec_float_init(); + + for(size_t i = 0; i < n; i++) { + cvec_float_push_back(&a1, rand_get() ); + } + cvec_float_sort(&a1); + g_result = *cvec_float_at(&a1, 0); + cvec_float_drop(&a1); +} + +/********************************************************************************************/ + +const config_func_t table[] = { + { 10, "List", 10000000, 0, test_list, 0}, + { 20, "Array", 100000000, 0, test_array, 0}, + { 30, "Rbtree", 1000000, 0, test_rbtree, 0}, + { 40, "dict", 1000000, 0, test_dict, 0}, + { 41, "dictBig", 1000000, 0, test_dict_big, 0}, + { 50, "Sort",10000000, 0, test_sort, 0}, +}; + +int main(int argc, const char *argv[]) +{ + test("STC", numberof(table), table, argc, argv); + exit(0); +}