mirror of
https://github.com/golang/go
synced 2024-09-30 04:24: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:
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) {
|
func TestMapIterDelete0(t *testing.T) {
|
||||||
// Delete all elements before first iteration.
|
// Delete all elements before first iteration.
|
||||||
m := map[string]int{"one": 1, "two": 2, "three": 3}
|
m := map[string]int{"one": 1, "two": 2, "three": 3}
|
||||||
|
@ -1665,7 +1665,7 @@ type hiter struct {
|
|||||||
checkBucket uintptr
|
checkBucket uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h hiter) initialized() bool {
|
func (h *hiter) initialized() bool {
|
||||||
return h.t != nil
|
return h.t != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user