Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions roaring64/benchmark123_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
//go:build go1.23
// +build go1.23

package roaring64

import (
"math/rand"
"testing"
)

func BenchmarkIterator123(b *testing.B) {
bm := New()
domain := uint64(100000000)
count := 10000
for j := 0; j < count; j++ {
v := uint64(rand.Int63n(int64(domain)))
bm.Add(v)
}
i := IntIterator64{}
expectedCardinality := bm.GetCardinality()
counter := uint64(0)

b.Run("simple iteration with alloc", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
i := bm.Iterator()
for i.HasNext() {
i.Next()
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
b.Run("simple iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
i.Initialize(bm)
for i.HasNext() {
i.Next()
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
b.Run("values iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
Values(bm)(func(_ uint64) bool {
counter++
return true
})
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
b.Run("reverse iteration with alloc", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
ir := bm.ReverseIterator()
for ir.HasNext() {
ir.Next()
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
ir := IntReverseIterator64{}

b.Run("reverse iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
ir.Initialize(bm)
for ir.HasNext() {
ir.Next()
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
b.Run("backward iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
Backward(bm)(func(_ uint64) bool {
counter++
return true
})
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}

b.Run("many iteration with alloc", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
buf := make([]uint64, 1024)
im := bm.ManyIterator()
for n := im.NextMany(buf); n != 0; n = im.NextMany(buf) {
counter += uint64(n)
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
im := ManyIntIterator64{}
buf := make([]uint64, 1024)

b.Run("many iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
im.Initialize(bm)
for n := im.NextMany(buf); n != 0; n = im.NextMany(buf) {
counter += uint64(n)
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}

b.Run("values iteration 1.23", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
for range Values(bm) {
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}

b.Run("backward iteration 1.23", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
for range Backward(bm) {
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
}
137 changes: 137 additions & 0 deletions roaring64/benchmark_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
package roaring64

import (
"math/rand"
"testing"
)

// BENCHMARKS, to run them type "go test -bench Benchmark -run -"

// go test -bench BenchmarkIteratorAlloc -benchmem -run -
func BenchmarkIteratorAlloc(b *testing.B) {
bm := New()
domain := uint64(100000000)
count := 10000
for j := 0; j < count; j++ {
v := uint64(rand.Int63n(int64(domain)))
bm.Add(v)
}
i := IntIterator64{}
expectedCardinality := bm.GetCardinality()
counter := uint64(0)
b.Run("simple iteration with alloc", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
i := bm.Iterator()
for i.HasNext() {
i.Next()
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
b.Run("simple iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
i.Initialize(bm)
for i.HasNext() {
i.Next()
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
b.Run("values iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
Values(bm)(func(_ uint64) bool {
counter++
return true
})
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
b.Run("reverse iteration with alloc", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
ir := bm.ReverseIterator()
for ir.HasNext() {
ir.Next()
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
ir := IntReverseIterator64{}

b.Run("reverse iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
ir.Initialize(bm)
for ir.HasNext() {
ir.Next()
counter++
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
b.Run("backward iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
Backward(bm)(func(_ uint64) bool {
counter++
return true
})
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}

b.Run("many iteration with alloc", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
buf := make([]uint64, 1024)
im := bm.ManyIterator()
for n := im.NextMany(buf); n != 0; n = im.NextMany(buf) {
counter += uint64(n)
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
im := ManyIntIterator64{}
buf := make([]uint64, 1024)

b.Run("many iteration", func(b *testing.B) {
for n := 0; n < b.N; n++ {
counter = 0
im.Initialize(bm)
for n := im.NextMany(buf); n != 0; n = im.NextMany(buf) {
counter += uint64(n)
}
}
b.StopTimer()
})
if counter != expectedCardinality {
b.Fatalf("Cardinalities don't match: %d, %d", counter, expectedCardinality)
}
}
Loading
Loading