From 9c5f0bc7bc81603376b472cb1c7ea8e3a38c6bd4 Mon Sep 17 00:00:00 2001 From: Radu Berinde Date: Mon, 5 Jan 2026 16:10:28 -0800 Subject: [PATCH] Improve binary fuse benchmark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run with both 8 and 16-bit fingerprints and with a few different sizes. Add a `MKeys/s` metric which is intuitive. Results on an Apple M1 laptop below. For comparison, on the same machine a cacheline-blocked bloom filter does ~130Mkeys/s. ``` name time/op BinaryFusePopulate/8/n=10000-10 199µs ± 1% BinaryFusePopulate/8/n=100000-10 2.55ms ± 1% BinaryFusePopulate/8/n=1000000-10 27.5ms ± 1% BinaryFusePopulate/16/n=10000-10 231µs ± 1% BinaryFusePopulate/16/n=100000-10 2.58ms ± 0% BinaryFusePopulate/16/n=1000000-10 29.0ms ± 1% name MKeys/s BinaryFusePopulate/8/n=10000-10 50.4 ± 1% BinaryFusePopulate/8/n=100000-10 39.2 ± 1% BinaryFusePopulate/8/n=1000000-10 36.4 ± 1% BinaryFusePopulate/16/n=10000-10 43.3 ± 1% BinaryFusePopulate/16/n=100000-10 38.8 ± 0% BinaryFusePopulate/16/n=1000000-10 34.5 ± 1% name alloc/op BinaryFusePopulate/8/n=10000-10 283kB ± 0% BinaryFusePopulate/8/n=100000-10 2.58MB ± 0% BinaryFusePopulate/8/n=1000000-10 24.8MB ± 0% BinaryFusePopulate/16/n=10000-10 321kB ± 0% BinaryFusePopulate/16/n=100000-10 2.91MB ± 0% BinaryFusePopulate/16/n=1000000-10 28.1MB ± 0% name allocs/op BinaryFusePopulate/8/n=10000-10 8.00 ± 0% BinaryFusePopulate/8/n=100000-10 8.00 ± 0% BinaryFusePopulate/8/n=1000000-10 8.00 ± 0% BinaryFusePopulate/16/n=10000-10 8.00 ± 0% BinaryFusePopulate/16/n=100000-10 8.00 ± 0% BinaryFusePopulate/16/n=1000000-10 8.00 ± 0% ``` --- binaryfusefilter_test.go | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/binaryfusefilter_test.go b/binaryfusefilter_test.go index ccdfeec..ff7d1fd 100644 --- a/binaryfusefilter_test.go +++ b/binaryfusefilter_test.go @@ -259,16 +259,28 @@ var ( bogusbinary *BinaryFuse[testType] ) -func BenchmarkBinaryFuseNPopulate1000000(b *testing.B) { - keys := make([]uint64, NUM_KEYS) - for i := range keys { - keys[i] = rand.Uint64() - } +func BenchmarkBinaryFusePopulate(b *testing.B) { + for _, bits := range []int{8, 16} { + for _, numKeys := range []int{10_000, 100_000, 1_000_000} { + b.Run(fmt.Sprintf("%d/n=%d", bits, numKeys), func(b *testing.B) { + keys := make([]uint64, numKeys) + for i := range keys { + keys[i] = rand.Uint64() + } - b.ResetTimer() + b.ResetTimer() + b.ReportAllocs() - for n := 0; n < b.N; n++ { - bogusbinary, _ = NewBinaryFuse[testType](keys) + for n := 0; n < b.N; n++ { + if bits == 8 { + _, _ = NewBinaryFuse[uint8](keys) + } else { + _, _ = NewBinaryFuse[uint16](keys) + } + } + b.ReportMetric(float64(b.N*numKeys)/b.Elapsed().Seconds()/1e6, "MKeys/s") + }) + } } }