summaryrefslogtreecommitdiffhomepage
path: root/misc/benchmarks/various/cbits_benchmark.cpp
blob: 1764f55665e42a7df99c6ba1c8bb647e77d1b4df (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
123
#include <iostream>
#include <bitset>
#include <cstdlib> // rand
#include <ctime> // timer

enum{ N=1<<22 }; // 4.2 mill.
#define i_static
#include <stc/crand.h>
#define i_type cbits
#define i_len N
#include <stc/cbits.h>

inline unsigned long get_time_in_ms()
{
    return (unsigned long)(1000 * clock() / CLOCKS_PER_SEC);
}


void one_sec_delay()
{
    unsigned long end_time = get_time_in_ms() + 1000;

    while(get_time_in_ms() < end_time)
    {
    }
}


int main(int argc, char **argv)
{
    size_t seed = time(NULL);

    using namespace std;
    bool *bools = new bool[N];

    unsigned long current_time, difference1, difference2;
    uint64_t total;

    one_sec_delay();

    total = 0;
    csrand(seed);
    current_time = get_time_in_ms();

    c_forrange (40 * N)
    {
        uint64_t r = crand();
        bools[r & (N-1)] = r & 1<<29;
    }

    difference1 = get_time_in_ms() - current_time;
    current_time = get_time_in_ms();

    c_forrange (100) c_forrange (num, N) 
    {
        total += bools[num];
    }

    delete [] bools;

    difference2 = get_time_in_ms() - current_time;

    cout << "Bool:" << endl << "sum total = " << total << ", random access time = " << difference1 
                            << ", sequential access time = " << difference2 << endl << endl;

    one_sec_delay();

    total = 0;
    csrand(seed);
    current_time = get_time_in_ms();
    bitset<N> bits;

    c_forrange (40 * N)
    {
        uint64_t r = crand();
        bits[r & (N-1)] = r & 1<<29;
    }

    difference1 = get_time_in_ms() - current_time;
    current_time = get_time_in_ms();

    c_forrange (100) c_forrange (num, N)
    {
        total += bits[num];
    }   

    difference2 = get_time_in_ms() - current_time;

    cout << "Bitset:" << endl << "sum total = " << total << ", random access time = " << difference1
                              << ", sequential access time = " << difference2 << endl << endl;

    one_sec_delay();

    total = 0;
    csrand(seed);
    current_time = get_time_in_ms();
    cbits bits2 = cbits_with_size(N, false);

    c_forrange (40 * N)
    {
        uint64_t r = crand();
        cbits_set_value(&bits2, r & (N-1), r & 1<<29);
    }

    difference1 = get_time_in_ms() - current_time;
    current_time = get_time_in_ms();

    c_forrange (100) c_forrange (num, N)
    {
        total += cbits_at(&bits2, num);
    }

    cbits_drop(&bits2);

    difference2 = get_time_in_ms() - current_time;

    cout << "cbits:" << endl << "sum total = " << total << ", random access time = " << difference1
                              << ", sequential access time = " << difference2 << endl << endl;

    //cin.get();

    return 0;
}