mirror of
https://github.com/golang/go
synced 2024-11-19 15:54:46 -07:00
encoding/xml: simplify slice-growing logic in rawToken
It appears that old code (from 2009) in xml.(*Decoder).rawToken replicates append's slice-growing functionality by allocating a new, bigger backing array and then calling copy. Simplifying the code by replacing it with a single append call does not seem to hurt performance: name old time/op new time/op delta Marshal-4 11.2µs ± 1% 11.3µs ±10% ~ (p=0.069 n=19+17) Unmarshal-4 28.6µs ± 1% 28.4µs ± 1% -0.60% (p=0.000 n=20+18) name old alloc/op new alloc/op delta Marshal-4 5.78kB ± 0% 5.78kB ± 0% ~ (all equal) Unmarshal-4 8.61kB ± 0% 8.27kB ± 0% -3.90% (p=0.000 n=20+20) name old allocs/op new allocs/op delta Marshal-4 23.0 ± 0% 23.0 ± 0% ~ (all equal) Unmarshal-4 189 ± 0% 190 ± 0% +0.53% (p=0.000 n=20+20) Change-Id: Ie580d1216a44760e611e63dee2c339af5465aea5 Reviewed-on: https://go-review.googlesource.com/86655 Reviewed-by: Daniel Martí <mvdan@mvdan.cc> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
bb355ed5eb
commit
252ee90971
@ -806,18 +806,7 @@ func (d *Decoder) rawToken() (Token, error) {
|
||||
}
|
||||
d.ungetc(b)
|
||||
|
||||
n := len(attr)
|
||||
if n >= cap(attr) {
|
||||
nCap := 2 * cap(attr)
|
||||
if nCap == 0 {
|
||||
nCap = 4
|
||||
}
|
||||
nattr := make([]Attr, n, nCap)
|
||||
copy(nattr, attr)
|
||||
attr = nattr
|
||||
}
|
||||
attr = attr[0 : n+1]
|
||||
a := &attr[n]
|
||||
a := Attr{}
|
||||
if a.Name, ok = d.nsname(); !ok {
|
||||
if d.err == nil {
|
||||
d.err = d.syntaxError("expected attribute name in element")
|
||||
@ -843,6 +832,7 @@ func (d *Decoder) rawToken() (Token, error) {
|
||||
}
|
||||
a.Value = string(data)
|
||||
}
|
||||
attr = append(attr, a)
|
||||
}
|
||||
if empty {
|
||||
d.needClose = true
|
||||
|
Loading…
Reference in New Issue
Block a user