reflect: add a copy of BenchmarkMap This is a copy of reflect_test.BenchmakMap from the Go standard library, added in http://golang.org/cl/345486. This is added to x/benchmarks only temporarily as a sample 'go test' benchmark to use with benchmarking tools. This benchmark was selected in particular because it had a significant performance improvement with a recent upstream change (http://golang.org/cl/345486). Change-Id: I2bff47ffbaab1d471a37ec3cba4bea88cc78d8ed Reviewed-on: https://go-review.googlesource.com/c/benchmarks/+/353649 Trust: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Pratt <mpratt@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> TryBot-Result: Go Bot <gobot@golang.org>
diff --git a/reflect/reflect_test.go b/reflect/reflect_test.go new file mode 100644 index 0000000..f02be3e --- /dev/null +++ b/reflect/reflect_test.go
@@ -0,0 +1,60 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package reflect_test + +import ( + "fmt" + "reflect" + "testing" +) + +// BenchmarkMap is a copy of reflect_test.BenchmarkMap from the Go standard +// library, placed here for basic benchmarking testing. +func BenchmarkMap(b *testing.B) { + type V *int + value := reflect.ValueOf((V)(nil)) + stringKeys := []string{} + mapOfStrings := map[string]V{} + uint64Keys := []uint64{} + mapOfUint64s := map[uint64]V{} + for i := 0; i < 100; i++ { + stringKey := fmt.Sprintf("key%d", i) + stringKeys = append(stringKeys, stringKey) + mapOfStrings[stringKey] = nil + + uint64Key := uint64(i) + uint64Keys = append(uint64Keys, uint64Key) + mapOfUint64s[uint64Key] = nil + } + + tests := []struct { + label string + m, keys, value reflect.Value + }{ + {"StringKeys", reflect.ValueOf(mapOfStrings), reflect.ValueOf(stringKeys), value}, + {"Uint64Keys", reflect.ValueOf(mapOfUint64s), reflect.ValueOf(uint64Keys), value}, + } + + for _, tt := range tests { + b.Run(tt.label, func(b *testing.B) { + b.Run("MapIndex", func(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + for j := tt.keys.Len() - 1; j >= 0; j-- { + tt.m.MapIndex(tt.keys.Index(j)) + } + } + }) + b.Run("SetMapIndex", func(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + for j := tt.keys.Len() - 1; j >= 0; j-- { + tt.m.SetMapIndex(tt.keys.Index(j), tt.value) + } + } + }) + }) + } +}