1
1
package bitvec
2
2
3
3
import (
4
+ "fmt"
4
5
"math/rand"
5
6
"testing"
6
7
)
@@ -9,6 +10,8 @@ var GoodSets = []uint64{0, 1, 2, 3, 4, 5, 10, 11, 20, 50, 89, 98, 99}
9
10
var UnSets = []uint64 {6 , 7 , 9 , 96 , 97 }
10
11
var BadSets = []uint64 {100 , 101 , 200 , 1000 }
11
12
13
+ var setSizes = []int {13 , 256 , 65536 , 16777216 }
14
+
12
15
func TestBV (t * testing.T ) {
13
16
bv := New (100 )
14
17
abv := NewAtomic (100 )
@@ -59,84 +62,66 @@ func TestBV(t *testing.T) {
59
62
60
63
}
61
64
62
- // func TestAtomicBV(t *testing.T) {
63
- // for _, k := range GoodSets {
64
- // if !bv.TrySet(k) {
65
- // t.Errorf("Error: could not set good index %d", k)
66
- // }
67
- // }
68
- // for _, k := range BadSets {
69
- // if bv.TrySet(k) {
70
- // t.Errorf("Error: successfully set bad index %d ", k)
71
- // }
72
- // }
73
-
74
- // for _, k := range UnSets {
75
- // if x, _ := bv.Get(k); x {
76
- // t.Errorf("Error: bit %d was not supposed to be set but was", k)
77
- // }
78
- // }
79
- // if _, err := bv.Get(101); err == nil {
80
- // t.Errorf("Error should be thrown for out of bounds access")
81
- // }
82
- // }
83
-
84
65
var r = rand .New (rand .NewSource (99 ))
85
- var sets = r .Perm (10_000_000 )
66
+ var sets = r .Perm (1024 * 1024 )
86
67
87
68
func BenchmarkSet (b * testing.B ) {
88
- b .Run ("bitvec/Set" , func (b * testing.B ) {
89
- bv := New (uint64 (b .N / 64 ))
90
- b .ResetTimer ()
91
- for n := 1 ; n < b .N ; n ++ {
92
- bv .TrySet (uint64 (sets [n % len (sets )] % n ))
93
- }
94
- })
95
- b .Run ("abitvec/Set" , func (b * testing.B ) {
96
- abv := NewAtomic (uint64 (b .N / 64 ))
97
- b .ResetTimer ()
98
- for n := 1 ; n < b .N ; n ++ {
99
- abv .TrySet (uint64 (sets [n % len (sets )] % n ))
100
- }
101
- })
102
- b .Run ("slice/Set" , func (b * testing.B ) {
103
- slice := make ([]bool , b .N )
104
- b .ResetTimer ()
105
- for n := 1 ; n < b .N ; n ++ {
106
- slice [sets [n % len (sets )]% n ] = true
107
- }
108
- })
69
+ for _ , setSize := range setSizes {
70
+ b .Run (fmt .Sprintf ("bitvec/Set size %d" , setSize ), func (b * testing.B ) {
71
+ bv := New (uint64 (setSize ))
72
+ b .ResetTimer ()
73
+ for i := 0 ; i < b .N ; i ++ {
74
+ bv .TrySet (uint64 (sets [i % len (sets )] % setSize ))
75
+ }
76
+ })
77
+ b .Run (fmt .Sprintf ("abitvec/Set size %d" , setSize ), func (b * testing.B ) {
78
+ abv := NewAtomic (uint64 (setSize ))
79
+ b .ResetTimer ()
80
+ for i := 0 ; i < b .N ; i ++ {
81
+ abv .TrySet (uint64 (sets [i % len (sets )] % setSize ))
82
+ }
83
+ })
84
+ b .Run (fmt .Sprintf ("slice/Set size %d" , setSize ), func (b * testing.B ) {
85
+ slice := make ([]bool , setSize )
86
+ b .ResetTimer ()
87
+ for i := 0 ; i < b .N ; i ++ {
88
+ slice [sets [i % len (sets )]% setSize ] = true
89
+ }
90
+ })
91
+ }
109
92
}
110
93
111
94
func BenchmarkGet (b * testing.B ) {
112
- b .Run ("bitvec/Get" , func (b * testing.B ) {
113
- bv := New (uint64 (b .N / 64 ))
114
- for n := 0 ; n < b .N && sets [n ]% 2 == 0 ; n ++ {
115
- bv .TrySet (uint64 (n ))
116
- }
117
- b .ResetTimer ()
118
- for n := 1 ; n < b .N ; n ++ {
119
- bv .Get (uint64 (sets [n % len (sets )] % n ))
120
- }
121
- })
122
- b .Run ("abitvec/Get" , func (b * testing.B ) {
123
- abv := NewAtomic (uint64 (b .N / 64 ))
124
- for n := 0 ; n < b .N && sets [n ]% 2 == 0 ; n ++ {
125
- abv .TrySet (uint64 (n ))
126
- }
127
- b .ResetTimer ()
128
- for n := 1 ; n < b .N ; n ++ {
129
- abv .Get (uint64 (sets [n % len (sets )] % n ))
130
- }
131
- })
132
- b .Run ("slice/Get" , func (b * testing.B ) {
133
- slice := make ([]bool , b .N )
134
- for n := 0 ; n < b .N && sets [n ]% 2 == 0 ; n ++ {
135
- slice [n ] = true
136
- }
137
- b .ResetTimer ()
138
- for n := 1 ; n < b .N ; n ++ {
139
- _ = slice [sets [n % len (sets )]% n ]
140
- }
141
- })
95
+ for _ , setSize := range setSizes {
96
+ b .Run (fmt .Sprintf ("bitvec/Get size %d" , setSize ), func (b * testing.B ) {
97
+ bv := New (uint64 (setSize ))
98
+ for n := 0 ; n < setSize && sets [n ]% 2 == 0 ; n ++ {
99
+ bv .TrySet (uint64 (n ))
100
+ }
101
+ b .ResetTimer ()
102
+ for i := 0 ; i < b .N ; i ++ {
103
+ bv .Get (uint64 (sets [i % len (sets )] % setSize ))
104
+ }
105
+ })
106
+ b .Run (fmt .Sprintf ("abitvec/Get size %d" , setSize ), func (b * testing.B ) {
107
+ abv := NewAtomic (uint64 (setSize ))
108
+ for n := 0 ; n < setSize && sets [n ]% 2 == 0 ; n ++ {
109
+ abv .TrySet (uint64 (n ))
110
+ }
111
+ b .ResetTimer ()
112
+ for i := 0 ; i < b .N ; i ++ {
113
+ abv .Get (uint64 (sets [i % len (sets )] % setSize ))
114
+ }
115
+ })
116
+ b .Run (fmt .Sprintf ("slice/Get size %d" , setSize ), func (b * testing.B ) {
117
+ slice := make ([]bool , setSize )
118
+ for n := 0 ; n < setSize && sets [n ]% 2 == 0 ; n ++ {
119
+ slice [n ] = true
120
+ }
121
+ b .ResetTimer ()
122
+ for i := 0 ; i < b .N ; i ++ {
123
+ _ = slice [sets [i % len (sets )]% setSize ]
124
+ }
125
+ })
126
+ }
142
127
}
0 commit comments