@@ -90,3 +90,103 @@ set2.Set(set) // Replace contents of set2 with set
9090set := bitset.New (1 , 2 , 3 , 5 , 7 , 8 , 9 , 10 )
9191fmt.Println (set) // Outputs: {1..3 5 7..10}
9292```
93+
94+ ## Benchmarking
95+
96+ The following benchmark results show that this bitset implementation is cuurently the fastest one in the core bitset operations and has the least number of allocations, comparing to the most popular solutions. Benchmarks code is in [ bitset-bench] ( https://github.com/KernelPryanic/bitset-bench ) repositry.
97+
98+ - Up to 3.17x faster than YourBasic/bit and 2.3x less memory
99+ - Up to 39.89x faster than RoaringBitmap/roaring and 10.4x less memory
100+ - Up to 1.7x faster than bits-and-blooms/bitset and 2.5x less memory
101+
102+ ``` sh
103+ goos: linux
104+ goarch: amd64
105+ pkg: bitset-bench
106+ cpu: 12th Gen Intel(R) Core(TM) i7-1270P
107+ BenchmarkNew_KernelPryanic/size_10-8 416101431 14.55 ns/op 8 B/op 1 allocs/op
108+ BenchmarkNew_KernelPryanic/size_100-8 72343773 81.69 ns/op 16 B/op 1 allocs/op
109+ BenchmarkNew_KernelPryanic/size_1000-8 8618655 700.6 ns/op 128 B/op 1 allocs/op
110+ BenchmarkNew_KernelPryanic/size_10000-8 890434 6825 ns/op 1280 B/op 1 allocs/op
111+ BenchmarkNew_YourBasic/size_10-8 154157577 38.77 ns/op 32 B/op 2 allocs/op
112+ BenchmarkNew_YourBasic/size_100-8 40817985 150.9 ns/op 48 B/op 3 allocs/op
113+ BenchmarkNew_YourBasic/size_1000-8 5279248 1128 ns/op 272 B/op 6 allocs/op
114+ BenchmarkNew_YourBasic/size_10000-8 596094 11082 ns/op 4112 B/op 10 allocs/op
115+ BenchmarkNew_Roaring/size_10-8 39293587 153.7 ns/op 160 B/op 7 allocs/op
116+ BenchmarkNew_Roaring/size_100-8 15196503 394.3 ns/op 384 B/op 10 allocs/op
117+ BenchmarkNew_Roaring/size_1000-8 3169102 1888 ns/op 2176 B/op 13 allocs/op
118+ BenchmarkNew_Roaring/size_10000-8 260258 22863 ns/op 33312 B/op 20 allocs/op
119+ BenchmarkNew_BitsAndBlooms/size_10-8 156515307 38.17 ns/op 40 B/op 2 allocs/op
120+ BenchmarkNew_BitsAndBlooms/size_100-8 50930841 118.6 ns/op 48 B/op 2 allocs/op
121+ BenchmarkNew_BitsAndBlooms/size_1000-8 7387969 809.4 ns/op 160 B/op 2 allocs/op
122+ BenchmarkNew_BitsAndBlooms/size_10000-8 770175 7717 ns/op 1312 B/op 2 allocs/op
123+ BenchmarkAdd_KernelPryanic/small-8 1000000000 2.340 ns/op 0 B/op 0 allocs/op
124+ BenchmarkAdd_KernelPryanic/medium-8 1000000000 2.339 ns/op 0 B/op 0 allocs/op
125+ BenchmarkAdd_KernelPryanic/large-8 1000000000 2.357 ns/op 0 B/op 0 allocs/op
126+ BenchmarkAdd_YourBasic/small-8 1000000000 2.340 ns/op 0 B/op 0 allocs/op
127+ BenchmarkAdd_YourBasic/medium-8 1000000000 2.368 ns/op 0 B/op 0 allocs/op
128+ BenchmarkAdd_YourBasic/large-8 1000000000 2.328 ns/op 0 B/op 0 allocs/op
129+ BenchmarkAdd_Roaring/small-8 704256816 8.225 ns/op 0 B/op 0 allocs/op
130+ BenchmarkAdd_Roaring/medium-8 300352508 20.56 ns/op 0 B/op 0 allocs/op
131+ BenchmarkAdd_Roaring/large-8 779435636 7.778 ns/op 0 B/op 0 allocs/op
132+ BenchmarkAdd_BitsAndBlooms/small-8 1000000000 2.320 ns/op 0 B/op 0 allocs/op
133+ BenchmarkAdd_BitsAndBlooms/medium-8 1000000000 2.323 ns/op 0 B/op 0 allocs/op
134+ BenchmarkAdd_BitsAndBlooms/large-8 1000000000 2.331 ns/op 0 B/op 0 allocs/op
135+ BenchmarkContains_KernelPryanic/small_present-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
136+ BenchmarkContains_KernelPryanic/small_absent-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
137+ BenchmarkContains_KernelPryanic/large_present-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
138+ BenchmarkContains_KernelPryanic/large_absent-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
139+ BenchmarkContains_YourBasic/small_present-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
140+ BenchmarkContains_YourBasic/small_absent-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
141+ BenchmarkContains_YourBasic/large_present-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
142+ BenchmarkContains_YourBasic/large_absent-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
143+ BenchmarkContains_Roaring/small_present-8 993212557 5.905 ns/op 0 B/op 0 allocs/op
144+ BenchmarkContains_Roaring/small_absent-8 858776072 6.935 ns/op 0 B/op 0 allocs/op
145+ BenchmarkContains_Roaring/large_present-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
146+ BenchmarkContains_Roaring/large_absent-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
147+ BenchmarkContains_BitsAndBlooms/small_present-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
148+ BenchmarkContains_BitsAndBlooms/small_absent-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
149+ BenchmarkContains_BitsAndBlooms/large_present-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
150+ BenchmarkContains_BitsAndBlooms/large_absent-8 1000000000 5.000 ns/op 0 B/op 0 allocs/op
151+ BenchmarkAnd_KernelPryanic/small_sets-8 585634084 10.26 ns/op 8 B/op 1 allocs/op
152+ BenchmarkAnd_KernelPryanic/large_sets-8 26665315 226.1 ns/op 1280 B/op 1 allocs/op
153+ BenchmarkAnd_YourBasic/small_sets-8 207960330 28.89 ns/op 32 B/op 2 allocs/op
154+ BenchmarkAnd_YourBasic/large_sets-8 23051258 257.4 ns/op 1304 B/op 2 allocs/op
155+ BenchmarkAnd_Roaring/small_sets-8 50966869 114.2 ns/op 152 B/op 6 allocs/op
156+ BenchmarkAnd_Roaring/large_sets-8 1534644 3905 ns/op 6920 B/op 6 allocs/op
157+ BenchmarkAnd_BitsAndBlooms/small_sets-8 193552717 31.06 ns/op 40 B/op 2 allocs/op
158+ BenchmarkAnd_BitsAndBlooms/large_sets-8 22592887 264.5 ns/op 1312 B/op 2 allocs/op
159+ BenchmarkOr_KernelPryanic/small_sets-8 552340365 10.74 ns/op 8 B/op 1 allocs/op
160+ BenchmarkOr_KernelPryanic/large_sets-8 25121366 239.8 ns/op 1280 B/op 1 allocs/op
161+ BenchmarkOr_YourBasic/small_sets-8 190544498 31.36 ns/op 32 B/op 2 allocs/op
162+ BenchmarkOr_YourBasic/large_sets-8 26454956 225.4 ns/op 1304 B/op 2 allocs/op
163+ BenchmarkOr_Roaring/small_sets-8 46533310 123.0 ns/op 160 B/op 6 allocs/op
164+ BenchmarkOr_Roaring/large_sets-8 1000000 5806 ns/op 8336 B/op 6 allocs/op
165+ BenchmarkOr_BitsAndBlooms/small_sets-8 183226694 32.70 ns/op 40 B/op 2 allocs/op
166+ BenchmarkOr_BitsAndBlooms/large_sets-8 21561354 278.3 ns/op 1312 B/op 2 allocs/op
167+ BenchmarkXor_KernelPryanic/small_sets-8 548258488 10.70 ns/op 8 B/op 1 allocs/op
168+ BenchmarkXor_KernelPryanic/large_sets-8 24955268 270.1 ns/op 1280 B/op 1 allocs/op
169+ BenchmarkXor_YourBasic/small_sets-8 175430082 33.91 ns/op 32 B/op 2 allocs/op
170+ BenchmarkXor_YourBasic/large_sets-8 19108676 339.3 ns/op 1304 B/op 2 allocs/op
171+ BenchmarkXor_Roaring/small_sets-8 40061660 146.6 ns/op 160 B/op 6 allocs/op
172+ BenchmarkXor_Roaring/large_sets-8 832849 6826 ns/op 8336 B/op 6 allocs/op
173+ BenchmarkXor_BitsAndBlooms/small_sets-8 162438415 36.87 ns/op 40 B/op 2 allocs/op
174+ BenchmarkXor_BitsAndBlooms/large_sets-8 17967027 344.1 ns/op 1312 B/op 2 allocs/op
175+ BenchmarkAndNot_KernelPryanic/small_sets-8 517138628 11.58 ns/op 8 B/op 1 allocs/op
176+ BenchmarkAndNot_KernelPryanic/large_sets-8 24691016 242.4 ns/op 1280 B/op 1 allocs/op
177+ BenchmarkAndNot_YourBasic/small_sets-8 207347138 29.10 ns/op 32 B/op 2 allocs/op
178+ BenchmarkAndNot_YourBasic/large_sets-8 22995970 262.2 ns/op 1304 B/op 2 allocs/op
179+ BenchmarkAndNot_Roaring/small_sets-8 51258081 116.9 ns/op 152 B/op 6 allocs/op
180+ BenchmarkAndNot_Roaring/large_sets-8 631980 9670 ns/op 15144 B/op 8 allocs/op
181+ BenchmarkAndNot_BitsAndBlooms/small_sets-8 181564711 32.89 ns/op 40 B/op 2 allocs/op
182+ BenchmarkAndNot_BitsAndBlooms/large_sets-8 19502276 309.9 ns/op 1312 B/op 2 allocs/op
183+ BenchmarkCopy_KernelPryanic/small_set-8 520315304 11.49 ns/op 16 B/op 1 allocs/op
184+ BenchmarkCopy_KernelPryanic/large_set-8 36169732 163.9 ns/op 1280 B/op 1 allocs/op
185+ BenchmarkCopy_Roaring/small_set-8 46287285 129.6 ns/op 316 B/op 7 allocs/op
186+ BenchmarkCopy_Roaring/large_set-8 5627685 1067 ns/op 8404 B/op 7 allocs/op
187+ BenchmarkCopy_BitsAndBlooms/small_set-8 165797050 37.20 ns/op 48 B/op 2 allocs/op
188+ BenchmarkCopy_BitsAndBlooms/large_set-8 21249416 298.9 ns/op 1312 B/op 2 allocs/op
189+ PASS
190+ ```
191+
192+ * Benchmarking was conducted on the P-cores.*
0 commit comments