diff --git a/bench/bench-qlibc.c b/bench/bench-qlibc.c new file mode 100644 index 00000000..a5c624cc --- /dev/null +++ b/bench/bench-qlibc.c @@ -0,0 +1,113 @@ +#define NDEBUG + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qlibc/qlibc.h" + +#include "common.h" + +/********************************************************************************************/ + +static void test_array(size_t n) +{ + qvector_t *a1 = qvector(16, sizeof(unsigned int), QVECTOR_RESIZE_DOUBLE); + if (!a1) abort(); + qvector_t *a2 = qvector(16, sizeof(unsigned int), QVECTOR_RESIZE_DOUBLE); + if (!a2) abort(); + + for(size_t i = 0; i < n; i++) { + unsigned int v = rand_get(); + bool success = a1->addlast(a1, &v); + if (!success) abort(); + v = rand_get(); + success = a2->addlast(a2, &v); + if (!success) abort(); + } + unsigned int s = 0; + for(unsigned long i = 0; i < n; i++) { + s += *(unsigned int*)a1->getat(a1, i, false) * *(unsigned int *) a2->getat(a2, i, false); + } + g_result = s; + a1->free(a1); + a2->free(a2); +} + +/********************************************************************************************/ + +static void test_list (size_t n) +{ + qlist_t *a1 = qlist(0); + qlist_t *a2 = qlist(0); + + for(size_t i = 0; i < n; i++) { + unsigned int u = rand_get(), v = rand_get(); + a1->addlast(a1, &u, sizeof(unsigned int)); + a2->addlast(a2, &v, sizeof(unsigned int)); + } + unsigned int s = 0; + qlist_obj_t it1, it2; + memset(&it1, 0, sizeof (it1)); + memset(&it2, 0, sizeof (it2)); + while (a1->getnext(a1, &it1, false) == true + && a2->getnext(a2, &it2, false) == true) { + s += *(unsigned int*)it1.data * *(unsigned int*)it2.data; + } + g_result = s; + a1->free(a1); + a2->free(a2); +} + +/********************************************************************************************/ + +static int compare(const void *key1, size_t size1, + const void *key2, size_t size2) +{ + assert(size1 == sizeof(unsigned long)); + assert(size2 == sizeof(unsigned long)); + const unsigned long *pa = key1; + const unsigned long *pb = key2; + return (*pa < *pb) ? -1 : (*pa > *pb); +} + +static void test_rbtree(size_t n) +{ + qtreetbl_t *tree = qtreetbl(0); + tree->set_compare(tree, compare); + for (size_t i = 0; i < n; i++) { + unsigned long v = rand_get(); + tree->put_by_obj(tree, + &v, sizeof(unsigned long), /* key */ + &v, sizeof(unsigned long) /* value */ ); + } + rand_init(); + unsigned int s = 0; + for (size_t i = 0; i < n; i++) { + unsigned long v = rand_get(); + void *obj = tree->get_by_obj(tree, (const char*)&v, sizeof(unsigned long), NULL, 0); + if (obj) + s += *(unsigned long*)obj; + } + g_result = s; + tree->free(tree); +} + +/* qlibc hash functions only accept a string as the key */ + +int main(int argc, const char *argv[]) +{ + int n = (argc > 1) ? atoi(argv[1]) : 0; + if (n == 20) + test_function("Array time", 100000000, test_array); + if (n == 10) + test_function("List time",10000000, test_list); + if (n == 30) + test_function("Rbtree time", 1000000, test_rbtree); + exit(0); +}