From 9692a1161c629828a55c1652ec356b76b09a7dca Mon Sep 17 00:00:00 2001 From: Tyge Løvset <60263450+tylo-work@users.noreply.github.com> Date: Fri, 20 Mar 2020 00:53:31 +0100 Subject: Add files via upload --- benchmark.cpp | 148 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 83 insertions(+), 65 deletions(-) (limited to 'benchmark.cpp') diff --git a/benchmark.cpp b/benchmark.cpp index d5b98c14..b53daa2a 100644 --- a/benchmark.cpp +++ b/benchmark.cpp @@ -1,86 +1,104 @@ #include #include #include + #include #include #include +#include "bytell_hash_map.hpp" declare_CMap(ii, int64_t, int64_t); declare_CVector_string(s); declare_CMap(ix, short, short); +const size_t seed = 123; // time(NULL); #define RAND() rand() * rand() +#define CMAP_SETUP(tag, Key, Value) CMap_##tag map = cmap_initializer; \ + cmap_##tag##_setMaxLoadFactor(&map, 0.77) +#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) +#define CMAP_SIZE(tag) cmap_size(map) +#define CMAP_BUCKETS(tag) cmap_buckets(map) +#define CMAP_CLEAR(tag) cmap_##tag##_destroy(&map) + + +#define UMAP_SETUP(tag, Key, Value) std::unordered_map map +#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) +#define UMAP_SIZE(tag) map.size() +#define UMAP_BUCKETS(tag) map.bucket_count() +#define UMAP_CLEAR(tag) map.clear() + + +#define BMAP_SETUP(tag, Key, Value) ska::bytell_hash_map map +#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) +#define BMAP_SIZE(tag) map.size() +#define BMAP_BUCKETS(tag) map.bucket_count() +#define BMAP_CLEAR(tag) map.clear() + +#define MAP_TEST1(M, tag) \ +{ \ + const size_t N = 70000000; \ + 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; \ + checksum += ++M##_PUT(tag, key, i); \ + break; \ + } \ + case 2: { \ + bool found = M##_FIND(tag, key); \ + if (found) { \ + M##_DEL(tag, key); \ + ++erased; \ + } \ + 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); \ + M##_CLEAR(tag); \ +} + +#define MAP_TEST2(M, tag) \ +{ \ + const size_t N = 10000000; \ + 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) \ + M##_PUT(tag, i*123, i); \ + for (size_t i = 0; i < N/2; ++i) \ + 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); \ + M##_CLEAR(tag); \ +} + + int main() { - clock_t before, difference; - CMap_ii map = cmap_initializer; - CMapEntry_ii* entry; - uint64_t checksum, inserted, erased, get; - const size_t N = 70000000, seed = 123; // time(NULL); + MAP_TEST1(CMAP, ii) + MAP_TEST1(UMAP, ii) + MAP_TEST1(BMAP, ii) - printf("Starting %llu\n", N); - cmap_ii_clear(&map); - cmap_ii_setMaxLoadFactor(&map, 0.77); - srand(seed); - before = clock(); - checksum = inserted = erased = get = 0; - for (size_t i = 0; i < N; ++i) { - int64_t rnd = RAND(); - int op = rand() >> 13; - switch (op) { - case 1: - ++inserted; - checksum += ++cmap_ii_put(&map, rnd, i)->value; - break; - case 2: - entry = cmap_ii_get(map, rnd); - if (entry) { - ++erased; - checksum += entry->value; - cmap_ii_erase(&map, rnd); - } - break; - case 3: - get += (cmap_ii_get(map, rnd) != NULL); - break; - } - } - difference = clock() - before; - printf("CMap: sz: %llu, bk: %llu, time: %.02f, sum: %llu, ins: %llu del: %llu\n", cmap_size(map), cmap_buckets(map), (float) difference / CLOCKS_PER_SEC, checksum, inserted, erased); - cmap_ii_destroy(&map); + MAP_TEST2(CMAP, ii) + MAP_TEST2(UMAP, ii) + MAP_TEST2(BMAP, ii) - std::unordered_map map2; - std::unordered_map::const_iterator iter; - srand(seed); - before = clock(); - checksum = inserted = erased = get = 0; - for (size_t i = 0; i < N; ++i) { - int64_t rnd = RAND(); - int op = rand() >> 13; - switch (op) { - case 1: - ++inserted; - checksum += ++(map2[rnd] = i); - break; - case 2: - iter = map2.find(rnd); - if (iter != map2.end()) { - ++erased; - checksum += iter->second; - map2.erase(rnd); - } - break; - case 3: - get += (map2.find(rnd) != map2.end()); - break; - } - } - difference = clock() - before; - printf("umap: sz: %llu, bk: %llu, time: %.02f, sum: %llu, ins: %llu del: %llu\n", map2.size(), map2.bucket_count(), (float) difference / CLOCKS_PER_SEC, checksum, inserted, erased); - map2.clear(); - printf("ix entry size %llu\n", sizeof(CMapEntry_ix)); CVector_s names = cvector_initializer; -- cgit v1.2.3