summaryrefslogtreecommitdiffhomepage
path: root/benchmark.cpp
blob: 38f76b8c1464fc61eb5bd91999847e11273af9ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#include <unordered_map>
#include <c_lib/cstring.h>
#include <c_lib/cmap.h>
#include "others/bytell_hash_map.hpp"
#include "others/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, 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)
#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<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)
#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<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)
#define BMAP_SIZE(tag)              map.size()
#define BMAP_BUCKETS(tag)           map.bucket_count()
#define BMAP_CLEAR(tag)             map.clear()

#define FMAP_SETUP(tag, Key, Value) ska::flat_hash_map<Key, Value> map; map.max_load_factor(maxLoadFactor)
#define FMAP_PUT(tag, key, value)   (map[key] = value)
#define FMAP_FIND(tag, key)         (map.find(key) != map.end())
#define FMAP_DEL(tag, key)          map.erase(key)
#define FMAP_SIZE(tag)              map.size()
#define FMAP_BUCKETS(tag)           map.bucket_count()
#define FMAP_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 = 7000000; \
    M##_SETUP(tag, int64_t, int64_t); \
    uint64_t checksum = 0, erased = 0; \
    srand(seed); \
    clock_t difference, before = clock(); \
    for (size_t i = 0; i < N; ++i) { \
        checksum += ++M##_PUT(tag, RAND(), i); \
        erased += M##_DEL(tag, RAND()); \
    } \
    difference = clock() - before; \
    printf(#M "(" #tag "): sz: %llu, bucks: %llu, time: %.02f, sum: %llu, erase: %llu\n", M##_SIZE(tag), M##_BUCKETS(tag), (float) difference / CLOCKS_PER_SEC, checksum, erased); \
    M##_CLEAR(tag); \
}

#define MAP_TEST2(M, tag) \
{ \
    const size_t N = 10000000; \
    M##_SETUP(tag, int64_t, int64_t); \
    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); \
    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, bucks: %llu, time: %.02f, erase %llu\n", M##_SIZE(tag), M##_BUCKETS(tag), (float) difference / CLOCKS_PER_SEC, erased); \
    M##_CLEAR(tag); \
}


int main()
{
    MAP_TEST1(UMAP, ii)
    MAP_TEST1(CMAP, ii)
    MAP_TEST1(BMAP, ii)
    MAP_TEST1(FMAP, ii)
    MAP_TEST1(RMAP, ii)

    MAP_TEST2(UMAP, ii)
    MAP_TEST2(CMAP, ii)
    MAP_TEST2(BMAP, ii)
    MAP_TEST2(FMAP, ii)
    MAP_TEST2(RMAP, ii)

    printf("ix entry size %llu\n", sizeof(CMapEntry_ix));
    
    CVector_s names = cvector_initializer;
    cvector_s_push(&names, cstring_make("Robert"));
    cvector_s_push(&names, cstring_make("Johnny"));
    cvector_s_push(&names, cstring_make("Anne"));
    cvector_s_push(&names, cstring_make("Ruth"));
    cvector_s_push(&names, cstring_make("Burt"));
    
    cvector_s_sort(&names);
    c_foreach (i, cvector_s, names)
        printf("%s\n", i.item->str);
    cvector_s_destroy(&names);
}