mirror of
https://github.com/golang/go
synced 2024-09-30 02:24:43 -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:
parent
fd09e88722
commit
89c527007f
@ -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}
|
||||
|
@ -1665,7 +1665,7 @@ type hiter struct {
|
||||
checkBucket uintptr
|
||||
}
|
||||
|
||||
func (h hiter) initialized() bool {
|
||||
func (h *hiter) initialized() bool {
|
||||
return h.t != nil
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user