xx/containerx/bucket/array_test.go

70 lines
1.3 KiB
Go

package bucket_test
import (
"runtime"
"testing"
"git.brut.systems/judah/xx/containerx/bucket"
"git.brut.systems/judah/xx/testx"
)
func TestArray_StableWithGC(t *testing.T) {
type valuewithptr struct {
value int
ptr *int
}
var arr bucket.Array[valuewithptr]
aptr := arr.Append(valuewithptr{value: 10, ptr: nil})
bptr := arr.Append(valuewithptr{value: 20, ptr: &aptr.value})
const N = 1000
for i := range N {
arr.Append(valuewithptr{value: i})
runtime.GC()
}
testx.Expect(t, arr.Get(0) == aptr)
testx.Expect(t, arr.Get(1) == bptr)
testx.Expect(t, arr.Len() == N+2, "len was %d", arr.Len())
testx.Expect(t, bptr.ptr != nil && bptr.value == 20)
testx.Expect(t, bptr.ptr == &aptr.value, "%p vs. %p", bptr.ptr, &aptr.value)
}
func BenchmarkArray_RandomAccess(b *testing.B) {
var arr bucket.Array[int]
for i := range b.N {
arr.Append(i * i)
}
b.ResetTimer()
for i := range b.N {
arr.Get(i % b.N)
}
}
func BenchmarkArray_Append(b *testing.B) {
var arr bucket.Array[int]
for i := range b.N {
arr.Append(i * i)
}
arr.Reset()
for i := range b.N {
arr.Append(i * i)
}
}
func BenchmarkArray_Iteration(b *testing.B) {
var arr bucket.Array[int]
for i := range b.N {
arr.Append(i * i)
}
b.ResetTimer()
sum := 0
for _, v := range arr.Values() {
sum += v
}
}