mirror of
https://github.com/golang/go
synced 2024-11-19 18:44:41 -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)
|
d.ungetc(b)
|
||||||
|
|
||||||
n := len(attr)
|
a := 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]
|
|
||||||
if a.Name, ok = d.nsname(); !ok {
|
if a.Name, ok = d.nsname(); !ok {
|
||||||
if d.err == nil {
|
if d.err == nil {
|
||||||
d.err = d.syntaxError("expected attribute name in element")
|
d.err = d.syntaxError("expected attribute name in element")
|
||||||
@ -843,6 +832,7 @@ func (d *Decoder) rawToken() (Token, error) {
|
|||||||
}
|
}
|
||||||
a.Value = string(data)
|
a.Value = string(data)
|
||||||
}
|
}
|
||||||
|
attr = append(attr, a)
|
||||||
}
|
}
|
||||||
if empty {
|
if empty {
|
||||||
d.needClose = true
|
d.needClose = true
|
||||||
|
Loading…
Reference in New Issue
Block a user