aboutsummaryrefslogtreecommitdiff
path: root/src/reflect/all_test.go
diff options
context:
space:
mode:
authorMartin Möhrmann <martin@golang.org>2021-10-31 17:58:07 +0100
committerMartin Möhrmann <martin@golang.org>2021-10-31 18:39:05 +0000
commit89c527007f75884a78ffede5d493ec021e7dfcdc (patch)
tree9fba4a42a987b9eaabf8195acbd24ac70562ec03 /src/reflect/all_test.go
parentfd09e88722e0af150bf8960e95e8da500ad91001 (diff)
downloadgo-89c527007f75884a78ffede5d493ec021e7dfcdc.tar.gz
go-89c527007f75884a78ffede5d493ec021e7dfcdc.zip
reflect: avoid stack copies of hiter
Use a pointer reciever to avoid copying the hiter struct when checking if it is intialized. Found through profiling that showed reflect map iteration spending a good amount of time in duffcopy. This change will also help other MapIter methods checking hiter struct initialization like Value() and Key(). name old time/op new time/op delta MapIterNext-12 97.9ns ± 4% 83.8ns ± 2% -14.37% (p=0.000 n=10+10) Change-Id: I73ab964fa28061ee7e6d5c663a85048bd2e0274e Reviewed-on: https://go-review.googlesource.com/c/go/+/360254 Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com> Trust: Josh Bleecher Snyder <josharian@gmail.com> Trust: Martin Möhrmann <martin@golang.org>
Diffstat (limited to 'src/reflect/all_test.go')
-rw-r--r--src/reflect/all_test.go10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go
index 725be28bf0..acc09962a0 100644
--- a/src/reflect/all_test.go
+++ b/src/reflect/all_test.go
@@ -7568,6 +7568,16 @@ func TestMapIterNext(t *testing.T) {
}
}
+func BenchmarkMapIterNext(b *testing.B) {
+ m := ValueOf(map[string]int{"a": 0, "b": 1, "c": 2, "d": 3})
+ it := m.MapRange()
+ for i := 0; i < b.N; i++ {
+ for it.Next() {
+ }
+ it.Reset(m)
+ }
+}
+
func TestMapIterDelete0(t *testing.T) {
// Delete all elements before first iteration.
m := map[string]int{"one": 1, "two": 2, "three": 3}