diff options
author | Martin Möhrmann <martin@golang.org> | 2021-10-31 17:58:07 +0100 |
---|---|---|
committer | Martin Möhrmann <martin@golang.org> | 2021-10-31 18:39:05 +0000 |
commit | 89c527007f75884a78ffede5d493ec021e7dfcdc (patch) | |
tree | 9fba4a42a987b9eaabf8195acbd24ac70562ec03 /src/reflect/all_test.go | |
parent | fd09e88722e0af150bf8960e95e8da500ad91001 (diff) | |
download | go-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.go | 10 |
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} |