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 } }