]> Cypherpunks repositories - gostls13.git/commit
reflect: remove calling mapiterkey, mapiterelem
authorKyle Xiao <xiaost7@gmail.com>
Thu, 12 Sep 2024 14:52:56 +0000 (22:52 +0800)
committerGopher Robot <gobot@golang.org>
Wed, 18 Sep 2024 20:57:20 +0000 (20:57 +0000)
commit7ba074fe43a3c1e9a35cd579520d7184d3a20d36
tree1d3d9753b6c0f66caf08bb1e3aa811dbb45c35be
parentc71b5ff76a1b1d79b53e268b83fb721e0af4614b
reflect: remove calling mapiterkey, mapiterelem

It makes use of the hiter structure which matches runtime.hiter's.

This change mainly improves the performance of Next method of MapIter.

goos: darwin
goarch: arm64
pkg: reflect
cpu: Apple M2
              │  ./old.txt  │              ./new.txt              │
              │   sec/op    │   sec/op     vs base                │
MapIterNext-8   61.95n ± 0%   54.95n ± 0%  -11.28% (p=0.000 n=10)

for the change of `test/escape_reflect.go`:
removing mapiterkey, mapiterelem would cause leaking MapIter content
when calling SetIterKey and SetIterValue,
and this may cause map bucket to be allocated on heap instead of stack.
Reproduce:
```
{
  m := map[int]int{1: 2} // escapes to heap after this change
  it := reflect.ValueOf(m).MapRange()
  it.Next()
  var k, v int
  reflect.ValueOf(&k).Elem().SetIterKey(it)
  reflect.ValueOf(&v).Elem().SetIterValue(it)
  println(k, v)
}
```
This CL would not introduce abi.NoEscape to fix this. It may need futher
optimization and tests on hiter field usage and its escape analysis.

Fixes #69416

Change-Id: Ibaa33bcf86228070b4a505b9512680791aa59f04
Reviewed-on: https://go-review.googlesource.com/c/go/+/612616
Reviewed-by: Keith Randall <khr@golang.org>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
src/reflect/map_noswiss.go
src/reflect/map_swiss.go
src/reflect/value.go
src/runtime/map_noswiss.go
test/escape_reflect.go