From 7943f6773864dfe1d63e4188a23a41f3f23d2b4f Mon Sep 17 00:00:00 2001 From: Tyge Løvset <60263450+tylo-work@users.noreply.github.com> Date: Tue, 10 Mar 2020 22:32:24 +0100 Subject: Benchmark and speedup Added benchmark.cpp and did a speedup trick in cmap --- benchmark.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ cmap.h | 7 +++++-- 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 benchmark.cpp diff --git a/benchmark.cpp b/benchmark.cpp new file mode 100644 index 00000000..ca65ce5a --- /dev/null +++ b/benchmark.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include "cmap.h" +#include "cvector.h" +#include "cstring.h" +#include "hash_set.hpp" +#include + + +declare_CMap(ii, int, int); +declare_CStringVector(s); + +int main() +{ + CMap_ii map = cmap_initializer; + uint64_t checksum = 0; + clock_t before, difference; + size_t fib1, fib2, fibx; + + const size_t N = 10000000; + + printf("Starting\n"); + //cmap_ii_reserve(&map, N * 1.7); + before = clock(); + fib1 = 0, fib2 = 1; + for (size_t i = 0; i < N; ++i) { + checksum += ++cmap_ii_put(&map, FIBONACCI_NEXT, i)->value; + } + difference = clock() - before; + printf("%llu Check: %f\n", checksum, 1.0 * difference / CLOCKS_PER_SEC); + cmap_ii_destroy(&map); + + std::unordered_map map2; + before = clock(); + fib1 = 0, fib2 = 1; checksum = 0; + for (size_t i = 0; i < N; ++i) + checksum += ++(map2[FIBONACCI_NEXT] = i); + difference = clock() - before; + printf("%llu Check: %f\n", checksum, 1.0 * difference / CLOCKS_PER_SEC); + map2.clear(); + + emhash7::HashMap map3; + //map3.reserve(N); + before = clock(); + fib1 = 0, fib2 = 1; checksum = 0; + for (size_t i = 0; i < N; ++i) + checksum += ++(*map3.insert(FIBONACCI_NEXT, i).first).second; + difference = clock() - before; + printf("%llu Check: %f\n", checksum, 1.0 * difference / CLOCKS_PER_SEC); +} \ No newline at end of file diff --git a/cmap.h b/cmap.h index 5ec158ec..a9a86e59 100644 --- a/cmap.h +++ b/cmap.h @@ -115,7 +115,7 @@ static inline void cmap_##tag##_swap(CMap_##tag* a, CMap_##tag* b) { \ static inline void cmap_##tag##_setMaxLoadFactor(CMap_##tag* self, float fac) { \ self->maxLoadFactor = fac; \ if (cmap_size(*self) > cmap_buckets(*self) * fac) \ - cmap_##tag##_reserve(self, 7 + (size_t) (cmap_size(*self) / fac)); \ + cmap_##tag##_reserve(self, 1 + (size_t) (cmap_size(*self) / fac)); \ } \ \ static inline size_t cmap_##tag##_bucket(CMap_##tag cm, KeyRaw rawKey) { \ @@ -139,7 +139,9 @@ static inline size_t cmap_##tag##_bucket(CMap_##tag cm, KeyRaw rawKey) { \ if (erased_idx == cap) erased_idx = idx; \ break; \ } \ - state = cm._vec.data[ idx = (first + FIBONACCI_NEXT) % cap ].state; \ + idx = first + FIBONACCI_NEXT; \ + if (idx >= cap) idx %= cap; \ + state = cm._vec.data[ idx ].state; \ } while (1); \ } \ \ @@ -219,4 +221,5 @@ static inline uint32_t cmap_reduce(uint32_t x, uint32_t N) { return ((uint64_t) x * (uint64_t) N) >> 32 ; } + #endif -- cgit v1.2.3 From 0311f213090836c068430523e1a1304dd7dabc3a Mon Sep 17 00:00:00 2001 From: Tyge Løvset <60263450+tylo-work@users.noreply.github.com> Date: Tue, 10 Mar 2020 22:46:20 +0100 Subject: Add files via upload Minor --- cmap.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmap.h b/cmap.h index a9a86e59..e12f7e4e 100644 --- a/cmap.h +++ b/cmap.h @@ -121,10 +121,10 @@ static inline void cmap_##tag##_setMaxLoadFactor(CMap_##tag* self, float fac) { static inline size_t cmap_##tag##_bucket(CMap_##tag cm, KeyRaw rawKey) { \ size_t cap = cvector_capacity(cm._vec); \ size_t idx = cmap_reduce(keyHasher(&rawKey, sizeof(Key)), cap); \ - size_t first = idx, erased_idx = cap, state = cm._vec.data[idx].state; \ + size_t first = idx, erased_idx = cap; \ FIBONACCI_DECL; \ do { \ - switch (state) { \ + switch (cm._vec.data[idx].state) { \ case CMapEntry_VACANT: \ return erased_idx != cap ? erased_idx : idx; \ case CMapEntry_INUSE: \ @@ -141,7 +141,6 @@ static inline size_t cmap_##tag##_bucket(CMap_##tag cm, KeyRaw rawKey) { \ } \ idx = first + FIBONACCI_NEXT; \ if (idx >= cap) idx %= cap; \ - state = cm._vec.data[ idx ].state; \ } while (1); \ } \ \ -- cgit v1.2.3