diff options
Diffstat (limited to 'benchmark.cpp')
| -rw-r--r-- | benchmark.cpp | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/benchmark.cpp b/benchmark.cpp index b53daa2a..9fdbb8fe 100644 --- a/benchmark.cpp +++ b/benchmark.cpp @@ -6,16 +6,19 @@ #include <c_lib/cstring.h>
#include <c_lib/cmap.h>
#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<Key, Value> map
+#define UMAP_SETUP(tag, Key, Value) std::unordered_map<Key, Value> 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<Key, Value> map
+#define BMAP_SETUP(tag, Key, Value) ska::bytell_hash_map<Key, Value> 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<Key, Value> 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));
|
