Commit 8f02df76 authored by Brian Smith's avatar Brian Smith Committed by Brad Fitzpatrick

encoding/xml: avoid an allocation for tags without attributes

Before, an array of size 4 would always be allocated even if a tag
doesn't have any attributes. Now that array is allocated only if
needed.

benchmark              old allocs     new allocs     delta
BenchmarkUnmarshal     191            176            -8.5%

Change-Id: I4d214b228883d0a6e892c0d6eb00dfe2da84c116
Reviewed-on: https://go-review.googlesource.com/4160Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 3d56fe6d
...@@ -723,7 +723,7 @@ func (d *Decoder) rawToken() (Token, error) { ...@@ -723,7 +723,7 @@ func (d *Decoder) rawToken() (Token, error) {
return nil, d.err return nil, d.err
} }
attr = make([]Attr, 0, 4) attr = []Attr{}
for { for {
d.space() d.space()
if b, ok = d.mustgetc(); !ok { if b, ok = d.mustgetc(); !ok {
...@@ -747,7 +747,11 @@ func (d *Decoder) rawToken() (Token, error) { ...@@ -747,7 +747,11 @@ func (d *Decoder) rawToken() (Token, error) {
n := len(attr) n := len(attr)
if n >= cap(attr) { if n >= cap(attr) {
nattr := make([]Attr, n, 2*cap(attr)) nCap := 2 * cap(attr)
if nCap == 0 {
nCap = 4
}
nattr := make([]Attr, n, nCap)
copy(nattr, attr) copy(nattr, attr)
attr = nattr attr = nattr
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment