[go] encoding/xml: use reflect.Value.Grow

1 view
Skip to first unread message

Daniel Martí (Gerrit)

unread,
Apr 7, 2023, 3:49:37 PM4/7/23
to goph...@pubsubhelper.golang.org, golang-...@googlegroups.com, Michael Knyszek, Gopher Robot, golang-co...@googlegroups.com

Daniel Martí submitted this change.

View Change

Approvals: Daniel Martí: Run TryBots Gopher Robot: TryBots succeeded Ian Lance Taylor: Looks good to me, approved Michael Knyszek: Looks good to me, but someone else must approve
encoding/xml: use reflect.Value.Grow

Like https://go.dev/cl/481376 did for encoding/gob,
but now for encoding/xml, which had very similar code.

One minor difference is that encoding/xml now needs a SetLen before the
call to Index, as otherwise we index just past the length.
Still, calling Grow and SetLen is easier to understand,
and avoids needing to make a new zero value.

goos: linux
goarch: amd64
pkg: encoding/xml
cpu: AMD Ryzen 7 PRO 5850U with Radeon Graphics
│ old │ new │
│ sec/op │ sec/op vs base │
Unmarshal-8 6.904µ ± 1% 6.980µ ± 1% +1.10% (p=0.009 n=6)

│ old │ new │
│ B/op │ B/op vs base │
Unmarshal-8 7.656Ki ± 0% 7.586Ki ± 0% -0.92% (p=0.002 n=6)

│ old │ new │
│ allocs/op │ allocs/op vs base │
Unmarshal-8 188.0 ± 0% 185.0 ± 0% -1.60% (p=0.002 n=6)

Change-Id: Id83feb467a9c59c80c7936aa892780aae7e8b809
Reviewed-on: https://go-review.googlesource.com/c/go/+/483135
TryBot-Result: Gopher Robot <go...@golang.org>
Reviewed-by: Michael Knyszek <mkny...@google.com>
Run-TryBot: Daniel Martí <mv...@mvdan.cc>
Reviewed-by: Ian Lance Taylor <ia...@google.com>
---
M src/encoding/xml/read.go
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/encoding/xml/read.go b/src/encoding/xml/read.go
index 43be08e..c1c843e 100644
--- a/src/encoding/xml/read.go
+++ b/src/encoding/xml/read.go
@@ -284,7 +284,8 @@
// Slice of element values.
// Grow slice.
n := val.Len()
- val.Set(reflect.Append(val, reflect.Zero(val.Type().Elem())))
+ val.Grow(1)
+ val.SetLen(n + 1)

// Recur to read element into slice.
if err := d.unmarshalAttr(val.Index(n), attr); err != nil {
@@ -410,7 +411,8 @@
// Slice of element values.
// Grow slice.
n := v.Len()
- v.Set(reflect.Append(val, reflect.Zero(v.Type().Elem())))
+ v.Grow(1)
+ v.SetLen(n + 1)

// Recur to read element into slice.
if err := d.unmarshal(v.Index(n), start, depth+1); err != nil {

To view, visit change 483135. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: go
Gerrit-Branch: master
Gerrit-Change-Id: Id83feb467a9c59c80c7936aa892780aae7e8b809
Gerrit-Change-Number: 483135
Gerrit-PatchSet: 2
Gerrit-Owner: Daniel Martí <mv...@mvdan.cc>
Gerrit-Reviewer: Daniel Martí <mv...@mvdan.cc>
Gerrit-Reviewer: Gopher Robot <go...@golang.org>
Gerrit-Reviewer: Ian Lance Taylor <ia...@google.com>
Gerrit-Reviewer: Michael Knyszek <mkny...@google.com>
Gerrit-MessageType: merged
Reply all
Reply to author
Forward
0 new messages