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;
}
|