From db61269d42fca2745947376bcb6c1bf97f8b0f14 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sat, 26 Oct 2019 15:03:44 -0300 Subject: [PATCH] Added compile time benchmark and bidimap tests --- benchmarks/compile_time/Makefile | 2 + benchmarks/compile_time/compile_time.c | 178 +++++++++++++++++++++++++ tests/main/main.c | 23 ++-- tests/main/unt/bidimap.c | 82 ++++++++++++ 4 files changed, 272 insertions(+), 13 deletions(-) create mode 100644 benchmarks/compile_time/Makefile create mode 100644 benchmarks/compile_time/compile_time.c diff --git a/benchmarks/compile_time/Makefile b/benchmarks/compile_time/Makefile new file mode 100644 index 0000000..de4d833 --- /dev/null +++ b/benchmarks/compile_time/Makefile @@ -0,0 +1,2 @@ +main: + gcc compile_time.c -c -O3 -ftime-report -I ../../src \ No newline at end of file diff --git a/benchmarks/compile_time/compile_time.c b/benchmarks/compile_time/compile_time.c new file mode 100644 index 0000000..02bc122 --- /dev/null +++ b/benchmarks/compile_time/compile_time.c @@ -0,0 +1,178 @@ +/* Compilation time for over 90 collections */ +#include + +struct imaginary +{ + double real; + double imag; +}; + +enum app_state +{ + TRACE = 1, + DEBUG = 2, + INFO = 3, + WARN = 4, + ERROR = 5, + FATAL = 6 +}; + +CMC_COLLECTION_GENERATE(BIDIMAP, bd0, bidimap0, struct imaginary, struct imaginary) +CMC_COLLECTION_GENERATE(DEQUE, d0, deque0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(HASHMAP, hm0, hmap0, struct imaginary, struct imaginary) +CMC_COLLECTION_GENERATE(HASHSET, hs0, hset0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(HEAP, h0, heap0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih0, iheap0, struct imaginary, struct imaginary) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll0, linked0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(LIST, l0, list0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(MULTIMAP, mm0, mmap0, struct imaginary, struct imaginary) +CMC_COLLECTION_GENERATE(MULTISET, ms0, mset0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(STACK, s0, stack0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl0, sotredlist0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(QUEUE, q0, queue0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(TREESET, ts0, tset0, /* K */, struct imaginary) +CMC_COLLECTION_GENERATE(TREEMAP, tm0, tmap0, struct imaginary, struct imaginary) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd1, bidimap1, int, int) +CMC_COLLECTION_GENERATE(DEQUE, d1, deque1, /* K */, int) +CMC_COLLECTION_GENERATE(HASHMAP, hm1, hmap1, int, int) +CMC_COLLECTION_GENERATE(HASHSET, hs1, hset1, /* K */, int) +CMC_COLLECTION_GENERATE(HEAP, h1, heap1, /* K */, int) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih1, iheap1, int, int) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll1, linked1, /* K */, int) +CMC_COLLECTION_GENERATE(LIST, l1, list1, /* K */, int) +CMC_COLLECTION_GENERATE(MULTIMAP, mm1, mmap1, int, int) +CMC_COLLECTION_GENERATE(MULTISET, ms1, mset1, /* K */, int) +CMC_COLLECTION_GENERATE(STACK, s1, stack1, /* K */, int) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl1, sotredlist1, /* K */, int) +CMC_COLLECTION_GENERATE(QUEUE, q1, queue1, /* K */, int) +CMC_COLLECTION_GENERATE(TREESET, ts1, tset1, /* K */, int) +CMC_COLLECTION_GENERATE(TREEMAP, tm1, tmap1, int, int) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd2, bidimap2, double, double) +CMC_COLLECTION_GENERATE(DEQUE, d2, deque2, /* K */, double) +CMC_COLLECTION_GENERATE(HASHMAP, hm2, hmap2, double, double) +CMC_COLLECTION_GENERATE(HASHSET, hs2, hset2, /* K */, double) +CMC_COLLECTION_GENERATE(HEAP, h2, heap2, /* K */, double) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih2, iheap2, double, double) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll2, linked2, /* K */, double) +CMC_COLLECTION_GENERATE(LIST, l2, list2, /* K */, double) +CMC_COLLECTION_GENERATE(MULTIMAP, mm2, mmap2, double, double) +CMC_COLLECTION_GENERATE(MULTISET, ms2, mset2, /* K */, double) +CMC_COLLECTION_GENERATE(STACK, s2, stack2, /* K */, double) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl2, sotredlist2, /* K */, double) +CMC_COLLECTION_GENERATE(QUEUE, q2, queue2, /* K */, double) +CMC_COLLECTION_GENERATE(TREESET, ts2, tset2, /* K */, double) +CMC_COLLECTION_GENERATE(TREEMAP, tm2, tmap2, double, double) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd3, bidimap3, size_t, size_t) +CMC_COLLECTION_GENERATE(DEQUE, d3, deque3, /* K */, size_t) +CMC_COLLECTION_GENERATE(HASHMAP, hm3, hmap3, size_t, size_t) +CMC_COLLECTION_GENERATE(HASHSET, hs3, hset3, /* K */, size_t) +CMC_COLLECTION_GENERATE(HEAP, h3, heap3, /* K */, size_t) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih3, iheap3, size_t, size_t) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll3, linked3, /* K */, size_t) +CMC_COLLECTION_GENERATE(LIST, l3, list3, /* K */, size_t) +CMC_COLLECTION_GENERATE(MULTIMAP, mm3, mmap3, size_t, size_t) +CMC_COLLECTION_GENERATE(MULTISET, ms3, mset3, /* K */, size_t) +CMC_COLLECTION_GENERATE(STACK, s3, stack3, /* K */, size_t) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl3, sotredlist3, /* K */, size_t) +CMC_COLLECTION_GENERATE(QUEUE, q3, queue3, /* K */, size_t) +CMC_COLLECTION_GENERATE(TREESET, ts3, tset3, /* K */, size_t) +CMC_COLLECTION_GENERATE(TREEMAP, tm3, tmap3, size_t, size_t) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd4, bidimap4, enum app_state, enum app_state) +CMC_COLLECTION_GENERATE(DEQUE, d4, deque4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(HASHMAP, hm4, hmap4, enum app_state, enum app_state) +CMC_COLLECTION_GENERATE(HASHSET, hs4, hset4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(HEAP, h4, heap4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih4, iheap4, enum app_state, enum app_state) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll4, linked4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(LIST, l4, list4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(MULTIMAP, mm4, mmap4, enum app_state, enum app_state) +CMC_COLLECTION_GENERATE(MULTISET, ms4, mset4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(STACK, s4, stack4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl4, sotredlist4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(QUEUE, q4, queue4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(TREESET, ts4, tset4, /* K */, enum app_state) +CMC_COLLECTION_GENERATE(TREEMAP, tm4, tmap4, enum app_state, enum app_state) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd5, bidimap5, void *, void *) +CMC_COLLECTION_GENERATE(DEQUE, d5, deque5, /* K */, void *) +CMC_COLLECTION_GENERATE(HASHMAP, hm5, hmap5, void *, void *) +CMC_COLLECTION_GENERATE(HASHSET, hs5, hset5, /* K */, void *) +CMC_COLLECTION_GENERATE(HEAP, h5, heap5, /* K */, void *) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih5, iheap5, void *, void *) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll5, linked5, /* K */, void *) +CMC_COLLECTION_GENERATE(LIST, l5, list5, /* K */, void *) +CMC_COLLECTION_GENERATE(MULTIMAP, mm5, mmap5, void *, void *) +CMC_COLLECTION_GENERATE(MULTISET, ms5, mset5, /* K */, void *) +CMC_COLLECTION_GENERATE(STACK, s5, stack5, /* K */, void *) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl5, sotredlist5, /* K */, void *) +CMC_COLLECTION_GENERATE(QUEUE, q5, queue5, /* K */, void *) +CMC_COLLECTION_GENERATE(TREESET, ts5, tset5, /* K */, void *) +CMC_COLLECTION_GENERATE(TREEMAP, tm5, tmap5, void *, void *) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd6, bidimap6, int *, int *) +CMC_COLLECTION_GENERATE(DEQUE, d6, deque6, /* K */, int *) +CMC_COLLECTION_GENERATE(HASHMAP, hm6, hmap6, int *, int *) +CMC_COLLECTION_GENERATE(HASHSET, hs6, hset6, /* K */, int *) +CMC_COLLECTION_GENERATE(HEAP, h6, heap6, /* K */, int *) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih6, iheap6, int *, int *) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll6, linked6, /* K */, int *) +CMC_COLLECTION_GENERATE(LIST, l6, list6, /* K */, int *) +CMC_COLLECTION_GENERATE(MULTIMAP, mm6, mmap6, int *, int *) +CMC_COLLECTION_GENERATE(MULTISET, ms6, mset6, /* K */, int *) +CMC_COLLECTION_GENERATE(STACK, s6, stack6, /* K */, int *) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl6, sotredlist6, /* K */, int *) +CMC_COLLECTION_GENERATE(QUEUE, q6, queue6, /* K */, int *) +CMC_COLLECTION_GENERATE(TREESET, ts6, tset6, /* K */, int *) +CMC_COLLECTION_GENERATE(TREEMAP, tm6, tmap6, int *, int *) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd7, bidimap7, struct imaginary *, struct imaginary *) +CMC_COLLECTION_GENERATE(DEQUE, d7, deque7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(HASHMAP, hm7, hmap7, struct imaginary *, struct imaginary *) +CMC_COLLECTION_GENERATE(HASHSET, hs7, hset7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(HEAP, h7, heap7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih7, iheap7, struct imaginary *, struct imaginary *) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll7, linked7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(LIST, l7, list7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(MULTIMAP, mm7, mmap7, struct imaginary *, struct imaginary *) +CMC_COLLECTION_GENERATE(MULTISET, ms7, mset7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(STACK, s7, stack7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl7, sotredlist7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(QUEUE, q7, queue7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(TREESET, ts7, tset7, /* K */, struct imaginary *) +CMC_COLLECTION_GENERATE(TREEMAP, tm7, tmap7, struct imaginary *, struct imaginary *) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd8, bidimap8, double *, double *) +CMC_COLLECTION_GENERATE(DEQUE, d8, deque8, /* K */, double *) +CMC_COLLECTION_GENERATE(HASHMAP, hm8, hmap8, double *, double *) +CMC_COLLECTION_GENERATE(HASHSET, hs8, hset8, /* K */, double *) +CMC_COLLECTION_GENERATE(HEAP, h8, heap8, /* K */, double *) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih8, iheap8, double *, double *) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll8, linked8, /* K */, double *) +CMC_COLLECTION_GENERATE(LIST, l8, list8, /* K */, double *) +CMC_COLLECTION_GENERATE(MULTIMAP, mm8, mmap8, double *, double *) +CMC_COLLECTION_GENERATE(MULTISET, ms8, mset8, /* K */, double *) +CMC_COLLECTION_GENERATE(STACK, s8, stack8, /* K */, double *) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl8, sotredlist8, /* K */, double *) +CMC_COLLECTION_GENERATE(QUEUE, q8, queue8, /* K */, double *) +CMC_COLLECTION_GENERATE(TREESET, ts8, tset8, /* K */, double *) +CMC_COLLECTION_GENERATE(TREEMAP, tm8, tmap8, double *, double *) + +CMC_COLLECTION_GENERATE(BIDIMAP, bd9, bidimap9, enum app_state *, enum app_state *) +CMC_COLLECTION_GENERATE(DEQUE, d9, deque9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(HASHMAP, hm9, hmap9, enum app_state *, enum app_state *) +CMC_COLLECTION_GENERATE(HASHSET, hs9, hset9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(HEAP, h9, heap9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(INTERVALHEAP, ih9, iheap9, enum app_state *, enum app_state *) +CMC_COLLECTION_GENERATE(LINKEDLIST, ll9, linked9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(LIST, l9, list9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(MULTIMAP, mm9, mmap9, enum app_state *, enum app_state *) +CMC_COLLECTION_GENERATE(MULTISET, ms9, mset9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(STACK, s9, stack9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(SORTEDLIST, sl9, sotredlist9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(QUEUE, q9, queue9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(TREESET, ts9, tset9, /* K */, enum app_state *) +CMC_COLLECTION_GENERATE(TREEMAP, tm9, tmap9, enum app_state *, enum app_state *) diff --git a/tests/main/main.c b/tests/main/main.c index 176679d..8828fcf 100644 --- a/tests/main/main.c +++ b/tests/main/main.c @@ -1,22 +1,21 @@ #include +#include "unt/bidimap.c" #include "unt/deque.c" #include "unt/hashmap.c" #include "unt/hashset.c" #include "unt/heap.c" +#include "unt/intervalheap.c" #include "unt/linkedlist.c" #include "unt/list.c" +#include "unt/multimap.c" +#include "unt/multiset.c" #include "unt/queue.c" +#include "unt/sortedlist.c" #include "unt/stack.c" #include "unt/treemap.c" #include "unt/treeset.c" -#include "unt/bidimap.c" -#include "unt/intervalheap.c" -#include "unt/multimap.c" -#include "unt/multiset.c" -#include "unt/sortedlist.c" - int main(void) { cmc_timer timer; @@ -24,24 +23,22 @@ int main(void) cmc_timer_start(timer); uintmax_t failed = 0; + failed += bidimap_test(); failed += deque_test(); failed += hashmap_test(); failed += hashset_test(); failed += heap_test(); + failed += intervalheap_test(); failed += linkedlist_test(); failed += list_test(); + failed += multimap_test(); + failed += multiset_test(); failed += queue_test(); + failed += sortedlist_test(); failed += stack_test(); failed += treemap_test(); failed += treeset_test(); - /* ext */ - failed += bidimap_test(); - failed += intervalheap_test(); - failed += multimap_test(); - failed += multiset_test(); - failed += sortedlist_test(); - cmc_timer_stop(timer); cmc_timer_calc(timer); diff --git a/tests/main/unt/bidimap.c b/tests/main/unt/bidimap.c index d201794..7b086d8 100644 --- a/tests/main/unt/bidimap.c +++ b/tests/main/unt/bidimap.c @@ -32,4 +32,86 @@ CMC_CREATE_UNIT(bidimap_test, true, { bm_free(map, NULL); }); + + CMC_CREATE_TEST(buffer_growth[capacity = 1], { + bidimap *map = bm_new(1, 0.7, cmp, hash, cmp, hash); + + for (size_t i = 1; i <= 10000; i++) + cmc_assert(bm_insert(map, i, i)); + + size_t sum = 0; + + for (size_t i = 0; i < bm_capacity(map); i++) + { + if (map->key_buffer[i] && map->key_buffer[i] != CMC_ENTRY_DELETED) + { + sum += map->key_buffer[i]->key; + } + } + + cmc_assert_equals(size_t, 50005000, sum); + + bm_free(map, NULL); + }); + + CMC_CREATE_TEST(copy_of, { + bidimap *map1 = bm_new(100, 0.7, cmp, hash, cmp, hash); + + for (size_t i = 0; i < 100; i++) + cmc_assert(bm_insert(map1, i, i)); + + bidimap *map2 = bm_copy_of(map1, NULL, NULL); + + cmc_assert_not_equals(ptr, NULL, map2); + cmc_assert_equals(size_t, bm_count(map1), bm_count(map2)); + + for (size_t i = 0; i < 100; i++) + { + cmc_assert(bm_contains_key(map2, i) && bm_contains_key(map1, i)); + cmc_assert(bm_contains_val(map2, i) && bm_contains_val(map1, i)); + } + + bm_free(map1, NULL); + bm_free(map2, NULL); + }); + + CMC_CREATE_TEST(equals, { + bidimap *map1 = bm_new(100, 0.7, cmp, hash, cmp, hash); + bidimap *map2 = bm_new(1000, 0.9, cmp, hash, cmp, hash); + + for (size_t i = 0; i < 100; i++) + { + cmc_assert(bm_insert(map1, i, i)); + cmc_assert(bm_insert(map2, 99 - i, 99 - i)); + } + + cmc_assert_not_equals(ptr, NULL, map1); + cmc_assert_not_equals(ptr, NULL, map2); + cmc_assert_equals(size_t, bm_count(map1), bm_count(map2)); + + for (size_t i = 0; i < 100; i++) + { + cmc_assert(bm_contains_key(map2, i) && bm_contains_key(map1, i)); + cmc_assert(bm_contains_val(map2, i) && bm_contains_val(map1, i)); + } + + bm_free(map1, NULL); + bm_free(map2, NULL); + }); + + CMC_CREATE_TEST(equals[from copy], { + bidimap *map1 = bm_new(100, 0.7, cmp, hash, cmp, hash); + + for (size_t i = 0; i < 100; i++) + cmc_assert(bm_insert(map1, i, i)); + + bidimap *map2 = bm_copy_of(map1, NULL, NULL); + + cmc_assert_not_equals(ptr, NULL, map2); + + cmc_assert(bm_equals(map1, map2)); + + bm_free(map1, NULL); + bm_free(map2, NULL); + }); });