From 07ccdaa3e3722997f80954a56aacd8f92f156476 Mon Sep 17 00:00:00 2001 From: Tyge Løvset <60263450+tylo-work@users.noreply.github.com> Date: Fri, 20 Mar 2020 15:07:49 +0100 Subject: Add files via upload --- benchmark.cpp | 51 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) (limited to 'benchmark.cpp') diff --git a/benchmark.cpp b/benchmark.cpp index b53daa2a..9fdbb8fe 100644 --- a/benchmark.cpp +++ b/benchmark.cpp @@ -6,16 +6,19 @@ #include #include #include "bytell_hash_map.hpp" +#include "robin_hood.hpp" + declare_CMap(ii, int64_t, int64_t); declare_CVector_string(s); declare_CMap(ix, short, short); const size_t seed = 123; // time(NULL); +const double maxLoadFactor = 0.77; #define RAND() rand() * rand() #define CMAP_SETUP(tag, Key, Value) CMap_##tag map = cmap_initializer; \ - cmap_##tag##_setMaxLoadFactor(&map, 0.77) + cmap_##tag##_setMaxLoadFactor(&map, maxLoadFactor) #define CMAP_PUT(tag, __key, __value) cmap_##tag##_put(&map, __key, __value)->value #define CMAP_DEL(tag, key) cmap_##tag##_erase(&map, key) #define CMAP_FIND(tag, key) (cmap_##tag##_get(map, key) != NULL) @@ -24,7 +27,7 @@ const size_t seed = 123; // time(NULL); #define CMAP_CLEAR(tag) cmap_##tag##_destroy(&map) -#define UMAP_SETUP(tag, Key, Value) std::unordered_map map +#define UMAP_SETUP(tag, Key, Value) std::unordered_map map; map.max_load_factor(maxLoadFactor) #define UMAP_PUT(tag, key, value) (map[key] = value) #define UMAP_FIND(tag, key) (map.find(key) != map.end()) #define UMAP_DEL(tag, key) map.erase(key) @@ -33,7 +36,7 @@ const size_t seed = 123; // time(NULL); #define UMAP_CLEAR(tag) map.clear() -#define BMAP_SETUP(tag, Key, Value) ska::bytell_hash_map map +#define BMAP_SETUP(tag, Key, Value) ska::bytell_hash_map map; map.max_load_factor(maxLoadFactor) #define BMAP_PUT(tag, key, value) (map[key] = value) #define BMAP_FIND(tag, key) (map.find(key) != map.end()) #define BMAP_DEL(tag, key) map.erase(key) @@ -41,33 +44,39 @@ const size_t seed = 123; // time(NULL); #define BMAP_BUCKETS(tag) map.bucket_count() #define BMAP_CLEAR(tag) map.clear() +#define RMAP_SETUP(tag, Key, Value) robin_hood::unordered_map map +#define RMAP_PUT(tag, key, value) (map[key] = value) +#define RMAP_FIND(tag, key) (map.find(key) != map.end()) +#define RMAP_DEL(tag, key) map.erase(key) +#define RMAP_SIZE(tag) map.size() +#define RMAP_BUCKETS(tag) map.bucket_count() +#define RMAP_CLEAR(tag) map.clear() + + #define MAP_TEST1(M, tag) \ { \ - const size_t N = 70000000; \ + const size_t N = 30000000; \ M##_SETUP(tag, int64_t, int64_t); \ uint64_t checksum = 0, inserted = 0, erased = 0; \ srand(seed); \ clock_t difference, before = clock(); \ for (size_t i = 0; i < N; ++i) { \ int64_t key = RAND(); \ - switch (key & 3) { \ - case 1: { \ - ++inserted; \ + switch (rand() & 1) { \ + case 0: { \ checksum += ++M##_PUT(tag, key, i); \ + ++inserted; \ break; \ } \ - case 2: { \ + case 1: { \ bool found = M##_FIND(tag, key); \ - if (found) { \ - M##_DEL(tag, key); \ - ++erased; \ - } \ + if (found) erased += M##_DEL(tag, key); \ break; \ } \ } \ } \ difference = clock() - before; \ - printf(#M "(" #tag "): sz: %llu, bk: %llu, time: %.02f, sum: %llu, ins: %llu\n", M##_SIZE(tag), M##_BUCKETS(tag), (float) difference / CLOCKS_PER_SEC, checksum, inserted); \ + printf(#M "(" #tag "): sz: %llu, bk: %llu, time: %.02f, sum: %llu, ins: %llu, del: %llu\n", M##_SIZE(tag), M##_BUCKETS(tag), (float) difference / CLOCKS_PER_SEC, checksum, inserted, erased); \ M##_CLEAR(tag); \ } @@ -75,29 +84,31 @@ const size_t seed = 123; // time(NULL); { \ const size_t N = 10000000; \ M##_SETUP(tag, int64_t, int64_t); \ - uint64_t checksum = 0, inserted = 0, erased = 0; \ srand(seed); \ + size_t erased = 0; \ clock_t difference, before = clock(); \ for (size_t i = 0; i < N; ++i) \ M##_PUT(tag, i*123, i); \ - for (size_t i = 0; i < N/2; ++i) \ - M##_DEL(tag, i*123); \ + const size_t D=N*3/4; \ + for (size_t i = 0; i < N; ++i) \ + erased += M##_DEL(tag, i*123); \ difference = clock() - before; \ - printf(#M "(" #tag "): sz: %llu, bk: %llu, time: %.02f\n", M##_SIZE(tag), M##_BUCKETS(tag), (float) difference / CLOCKS_PER_SEC); \ + printf(#M "(" #tag "): sz: %llu, bk: %llu, time: %.02f, del %llu\n", M##_SIZE(tag), M##_BUCKETS(tag), (float) difference / CLOCKS_PER_SEC, erased); \ M##_CLEAR(tag); \ } int main() { - MAP_TEST1(CMAP, ii) MAP_TEST1(UMAP, ii) + MAP_TEST1(CMAP, ii) MAP_TEST1(BMAP, ii) + MAP_TEST1(RMAP, ii) - MAP_TEST2(CMAP, ii) MAP_TEST2(UMAP, ii) + MAP_TEST2(CMAP, ii) MAP_TEST2(BMAP, ii) - + MAP_TEST2(RMAP, ii) printf("ix entry size %llu\n", sizeof(CMapEntry_ix)); -- cgit v1.2.3