#define NDEBUG #include #include #include #include "kvec.h" #include "klist.h" #include "kbtree.h" #include "khash.h" #include "ksort.h" #include "common.h" /********************************************************************************************/ static void test_array(size_t n) { kvec_t(unsigned int) a1, a2; kv_init(a1); kv_init(a2); for(size_t i = 0; i < n; i++) { kv_push(unsigned int, a1, rand_get() ); kv_push(unsigned int, a2, rand_get() ); } unsigned int s = 0; for(unsigned long i = 0; i < n; i++) { s += kv_A(a1, i ) * kv_A(a2, i ); } g_result = s; kv_destroy(a1); kv_destroy(a2); } /********************************************************************************************/ #define uint_free(x) KLIST_INIT(list_uint, unsigned int, uint_free) static void test_list (size_t n) { klist_t(list_uint) *a1, *a2; a1 = kl_init(list_uint); a2 = kl_init(list_uint); for(size_t i = 0; i < n; i++) { *kl_pushp (list_uint, a1) = rand_get(); *kl_pushp (list_uint, a2) = rand_get(); } unsigned int s = 0; kliter_t(list_uint) *it1, *it2; for(it1 = kl_begin(a1), it2 = kl_begin(a2); it1 != kl_end(a1); it1 = kl_next(it1), it2 = kl_next(it2)) { s += kl_val(it1) * kl_val(it2); } g_result = s; kl_destroy(list_uint, a1); kl_destroy(list_uint, a2); } /********************************************************************************************/ #define my_cmp(a,b) ( (a) < (b) ? -1 : (a) > (b) ) KBTREE_INIT(kTree, unsigned long, my_cmp) static void test_rbtree(size_t n) { kbtree_t(kTree) *tree; tree = kb_init(kTree, KB_DEFAULT_SIZE/2); for (size_t i = 0; i < n; i++) { unsigned long j = rand_get(); kb_putp(kTree, tree, &j); } rand_init(); unsigned int s = 0; for (size_t i = 0; i < n; i++) { unsigned long j = rand_get(); if (kb_getp(kTree, tree, &j) != 0) s+= j; } g_result = s; kb_destroy(kTree, tree); } /********************************************************************************************/ #define hash_eq(a, b) ((a) == (b)) #define hash_func(a) kh_int64_hash_func(a) KHASH_INIT(iun, unsigned long, unsigned long, 1, hash_func, hash_eq) static void test_dict(size_t n) { khash_t(iun) *dict = kh_init(iun); for (size_t i = 0; i < n; i++) { int ret; khiter_t k = kh_put(iun, dict, rand_get(), &ret); kh_value(dict, k) = rand_get(); } rand_init(); unsigned int s = 0; for (size_t i = 0; i < n; i++) { khiter_t k = kh_get(iun, dict, rand_get()); if (kh_exist(dict, k)) s += kh_value(dict, k); } g_result = s; kh_destroy(iun, 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 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; } KHASH_INIT(iub, char_array_t, char_array_t, 1, char_hash, char_equal_p) static void test_dict_big(size_t n) { khash_t(iub) *dict = kh_init(iub); for (size_t i = 0; i < n; i++) { int ret; char_array_t s1, s2; sprintf(s1.a, "%u", rand_get()); sprintf(s2.a, "%u", rand_get()); khiter_t k = kh_put(iub, dict, s1, &ret); char_set(&kh_value(dict, k), 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()); khiter_t k = kh_get(iub, dict, s1); if (kh_exist(dict, k)) s ++; } g_result = s; kh_destroy(iub, dict); } /********************************************************************************************/ // NOTE: Needed for compiling double drand48(void) { return rand_get(); } KSORT_INIT_GENERIC(float) static void test_sort(size_t n) { kvec_t(float) a1; kv_init(a1); for(size_t i = 0; i < n; i++) { kv_push(float, a1, rand_get() ); } // NOTE: Is-it the right way to do? Seems very low level! ks_introsort_float(n, & kv_A(a1, 0)); g_result = kv_A(a1, 0); kv_destroy(a1); } /********************************************************************************************/ int main(int argc, const char *argv[]) { int n = (argc > 1) ? atoi(argv[1]): 0; if (n == 10) test_function("List time",10000000, test_list); if (n == 20) test_function("Array time", 100000000, test_array); if (n == 30) test_function("B-tree time", 1000000, test_rbtree); if (n == 40) test_function("DictOA time", 1000000, test_dict); if (n == 41) test_function("DictB time", 1000000, test_dict_big); if (n == 50) test_function("Sort time", 10000000, test_sort); exit(0); }