1
0
mirror of https://github.com/golang/go synced 2024-09-30 04:14:29 -06:00

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>
This commit is contained in:
Martin Möhrmann 2021-10-31 17:58:07 +01:00
parent fd09e88722
commit 89c527007f
2 changed files with 11 additions and 1 deletions

View File

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

View File

@ -1665,7 +1665,7 @@ type hiter struct {
checkBucket uintptr
}
func (h hiter) initialized() bool {
func (h *hiter) initialized() bool {
return h.t != nil
}