diff --git a/pmap_test.go b/pmap_test.go index 7f25dd3..617e79f 100644 --- a/pmap_test.go +++ b/pmap_test.go @@ -5,16 +5,104 @@ import "testing" func TestPmap(t *testing.T) { p := New() const numElems = 100 - for i := range make([]int, numElems) { + for i := range iter(numElems) { p = p.Set(i, i) } if p.Len() != numElems { t.Fatalf("Len() = %v, want %v", p.Len(), numElems) } - for i := range make([]int, numElems) { + for i := range iter(numElems) { v, ok := p.Get(i) if v != i || !ok { t.Errorf("Get(%d) = %v %v, want %v %v", i, v, ok, i, true) } } } + +func BenchmarkGet(b *testing.B) { + b.Run("size=10", func(b *testing.B) { benchmarkGet(b, 10) }) + b.Run("size=100", func(b *testing.B) { benchmarkGet(b, 100) }) + b.Run("size=1000", func(b *testing.B) { benchmarkGet(b, 1000) }) + b.Run("size=10000", func(b *testing.B) { benchmarkGet(b, 10000) }) +} + +func BenchmarkGetAbsent(b *testing.B) { + b.Run("size=10", func(b *testing.B) { benchmarkGetAbsent(b, 10) }) + b.Run("size=100", func(b *testing.B) { benchmarkGetAbsent(b, 100) }) + b.Run("size=1000", func(b *testing.B) { benchmarkGetAbsent(b, 1000) }) + b.Run("size=10000", func(b *testing.B) { benchmarkGetAbsent(b, 10000) }) +} + +func benchmarkGet(b *testing.B, numElems int) { + p := New() + for i := range iter(numElems) { + p = p.Set(i, i) + } + if p.Len() != numElems { + b.Fatalf("Len() = %v, want %v", p.Len(), numElems) + } + b.ResetTimer() + i := 0 + for range iter(b.N) { + v, ok := p.Get(i) + if v != i || !ok { + b.Errorf("Get(%d) = %v %v, want %v %v", i, v, ok, i, true) + } + i++ + if i >= numElems { + i = 0 + } + } +} + +func benchmarkGetAbsent(b *testing.B, numElems int) { + p := New() + for i := range iter(numElems) { + p = p.Set(-i-1, i) + } + if p.Len() != numElems { + b.Fatalf("Len() = %v, want %v", p.Len(), numElems) + } + b.ResetTimer() + i := 0 + for range iter(b.N) { + v, ok := p.Get(i) + if ok { + b.Errorf("Get(%d) = %v %v, want %v %v", i, v, ok, 0, false) + } + i++ + } +} + +func iter(n int) []struct{} { + return make([]struct{}, n) +} + +func BenchmarkHmapGet_baseline(b *testing.B) { + b.Run("size=10", func(b *testing.B) { benchmarkHmapGet(b, 10) }) + b.Run("size=100", func(b *testing.B) { benchmarkHmapGet(b, 100) }) + b.Run("size=1000", func(b *testing.B) { benchmarkHmapGet(b, 1000) }) + b.Run("size=10000", func(b *testing.B) { benchmarkHmapGet(b, 10000) }) +} + +func benchmarkHmapGet(b *testing.B, numElems int) { + h := make(map[int]int) + for i := range iter(numElems) { + h[i] = i + } + if len(h) != numElems { + b.Fatalf("Len() = %v, want %v", len(h), numElems) + } + b.ResetTimer() + i := 0 + for range iter(b.N) { + v, ok := h[i] + if v != i || !ok { + b.Errorf("h[%d] = %v %v, want %v %v", i, v, ok, i, true) + } + i++ + if i >= numElems { + i = 0 + } + } +}