@@ -14,7 +14,9 @@ var setSizes = []int{13, 256, 65536, 16777216}
14
14
15
15
func TestBV (t * testing.T ) {
16
16
bv := New (100 )
17
+ bv2 := New (100 )
17
18
abv := NewAtomic (100 )
19
+ abv2 := NewAtomic (100 )
18
20
t .Run ("valid indices" , func (t * testing.T ) {
19
21
for _ , k := range GoodSets {
20
22
if ! bv .TrySet (k ) {
@@ -23,13 +25,30 @@ func TestBV(t *testing.T) {
23
25
if ! abv .TrySet (k ) {
24
26
t .Errorf ("abv could not set good index %d" , k )
25
27
}
28
+ bv2 .Set (k )
29
+ abv2 .Set (k )
26
30
27
31
if x , _ := bv .Get (k ); ! x {
28
32
t .Errorf ("bv bit %d was supposed to be set but wasn't" , k )
29
33
}
30
34
if x , _ := abv .Get (k ); ! x {
31
35
t .Errorf ("abv bit %d was supposed to be set but wasn't" , k )
32
36
}
37
+ if x , _ := bv2 .Get (k ); ! x {
38
+ t .Errorf ("bv2 bit %d was supposed to be set but wasn't" , k )
39
+ }
40
+ if x , _ := abv2 .Get (k ); ! x {
41
+ t .Errorf ("abv2 bit %d was supposed to be set but wasn't" , k )
42
+ }
43
+
44
+ bv .Clear (k )
45
+ if x , _ := bv .Get (k ); x {
46
+ t .Errorf ("bv bit %d was supposed to be cleared but wasn't" , k )
47
+ }
48
+ abv .Clear (k )
49
+ if x , _ := abv .Get (k ); x {
50
+ t .Errorf ("abv bit %d was supposed to be cleared but wasn't" , k )
51
+ }
33
52
}
34
53
})
35
54
t .Run ("invalid indices" , func (t * testing.T ) {
@@ -40,12 +59,21 @@ func TestBV(t *testing.T) {
40
59
if abv .TrySet (k ) {
41
60
t .Errorf ("abv successfully set bad index %d " , k )
42
61
}
43
- }
44
- if _ , err := bv .Get (101 ); err == nil {
45
- t .Errorf ("bv error should be thrown for out of bounds access" )
46
- }
47
- if _ , err := abv .Get (101 ); err == nil {
48
- t .Errorf ("abv error should be thrown for out of bounds access" )
62
+ if bv2 .Set (k ) == nil {
63
+ t .Errorf ("bv2 successfully set bad index %d " , k )
64
+ }
65
+ if abv2 .Set (k ) == nil {
66
+ t .Errorf ("abv2 successfully set bad index %d " , k )
67
+ }
68
+ if _ , err := bv .Get (k ); err == nil {
69
+ t .Errorf ("bv error should be thrown for out of bounds access" )
70
+ }
71
+ if _ , err := abv .Get (k ); err == nil {
72
+ t .Errorf ("abv error should be thrown for out of bounds access" )
73
+ }
74
+ if bv .Clear (k ) == nil {
75
+ t .Errorf ("bv error should be thrown for out of bounds access" )
76
+ }
49
77
}
50
78
51
79
})
@@ -63,22 +91,22 @@ func TestBV(t *testing.T) {
63
91
}
64
92
65
93
var r = rand .New (rand .NewSource (99 ))
66
- var sets = r .Perm (1024 * 1024 )
94
+ var sets = r .Perm (setSizes [ len ( setSizes ) - 1 ] )
67
95
68
96
func BenchmarkSet (b * testing.B ) {
69
97
for _ , setSize := range setSizes {
70
98
b .Run (fmt .Sprintf ("bitvec/Set size %d" , setSize ), func (b * testing.B ) {
71
99
bv := New (uint64 (setSize ))
72
100
b .ResetTimer ()
73
101
for i := 0 ; i < b .N ; i ++ {
74
- bv .TrySet (uint64 (sets [i % len (sets )] % setSize ))
102
+ bv .Set (uint64 (sets [i % len (sets )] % setSize ))
75
103
}
76
104
})
77
105
b .Run (fmt .Sprintf ("abitvec/Set size %d" , setSize ), func (b * testing.B ) {
78
106
abv := NewAtomic (uint64 (setSize ))
79
107
b .ResetTimer ()
80
108
for i := 0 ; i < b .N ; i ++ {
81
- abv .TrySet (uint64 (sets [i % len (sets )] % setSize ))
109
+ abv .Set (uint64 (sets [i % len (sets )] % setSize ))
82
110
}
83
111
})
84
112
b .Run (fmt .Sprintf ("slice/Set size %d" , setSize ), func (b * testing.B ) {
@@ -89,8 +117,28 @@ func BenchmarkSet(b *testing.B) {
89
117
}
90
118
})
91
119
}
120
+ fmt .Println ()
92
121
}
93
122
123
+ func BenchmarkTrySet (b * testing.B ) {
124
+ for _ , setSize := range setSizes {
125
+ b .Run (fmt .Sprintf ("bitvec/TrySet size %d" , setSize ), func (b * testing.B ) {
126
+ bv := New (uint64 (setSize ))
127
+ b .ResetTimer ()
128
+ for i := 0 ; i < b .N ; i ++ {
129
+ bv .TrySet (uint64 (sets [i % len (sets )] % setSize ))
130
+ }
131
+ })
132
+ b .Run (fmt .Sprintf ("abitvec/TrySet size %d" , setSize ), func (b * testing.B ) {
133
+ abv := NewAtomic (uint64 (setSize ))
134
+ b .ResetTimer ()
135
+ for i := 0 ; i < b .N ; i ++ {
136
+ abv .TrySet (uint64 (sets [i % len (sets )] % setSize ))
137
+ }
138
+ })
139
+ }
140
+ fmt .Println ()
141
+ }
94
142
func BenchmarkGet (b * testing.B ) {
95
143
for _ , setSize := range setSizes {
96
144
b .Run (fmt .Sprintf ("bitvec/Get size %d" , setSize ), func (b * testing.B ) {
@@ -124,4 +172,40 @@ func BenchmarkGet(b *testing.B) {
124
172
}
125
173
})
126
174
}
175
+ fmt .Println ()
176
+ }
177
+ func BenchmarkClear (b * testing.B ) {
178
+ for _ , setSize := range setSizes {
179
+ b .Run (fmt .Sprintf ("bitvec/Clear size %d" , setSize ), func (b * testing.B ) {
180
+ bv := New (uint64 (setSize ))
181
+ for i := 0 ; i < b .N ; i ++ {
182
+ bv .Set (uint64 (sets [i % len (sets )] % setSize ))
183
+ }
184
+ b .ResetTimer ()
185
+ for i := 0 ; i < b .N ; i ++ {
186
+ bv .Clear (uint64 (sets [i % len (sets )] % setSize ))
187
+ }
188
+ })
189
+ b .Run (fmt .Sprintf ("abitvec/Clear size %d" , setSize ), func (b * testing.B ) {
190
+ abv := NewAtomic (uint64 (setSize ))
191
+ for i := 0 ; i < b .N ; i ++ {
192
+ abv .Set (uint64 (sets [i % len (sets )] % setSize ))
193
+ }
194
+ b .ResetTimer ()
195
+ for i := 0 ; i < b .N ; i ++ {
196
+ abv .Clear (uint64 (sets [i % len (sets )] % setSize ))
197
+ }
198
+ })
199
+ b .Run (fmt .Sprintf ("slice/Clear size %d" , setSize ), func (b * testing.B ) {
200
+ slice := make ([]bool , setSize )
201
+ for i := 0 ; i < b .N ; i ++ {
202
+ slice [sets [i % len (sets )]% setSize ] = true
203
+ }
204
+ b .ResetTimer ()
205
+ for i := 0 ; i < b .N ; i ++ {
206
+ slice [sets [i % len (sets )]% setSize ] = false
207
+ }
208
+ })
209
+ }
210
+ fmt .Println ()
127
211
}
0 commit comments