aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/xml
diff options
context:
space:
mode:
authorAlberto Donizetti <alb.donizetti@gmail.com>2018-01-08 13:03:57 +0100
committerBrad Fitzpatrick <bradfitz@golang.org>2018-02-19 23:42:57 +0000
commit252ee90971d87f099a2e67c3536a0481a535157f (patch)
tree29d6b800393c1bfe5da66cc97113780adc9a1756 /src/encoding/xml
parentbb355ed5ebb24179be4e1093c3dce12e23f21d56 (diff)
downloadgo-252ee90971d87f099a2e67c3536a0481a535157f.tar.gz
go-252ee90971d87f099a2e67c3536a0481a535157f.zip
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>
Diffstat (limited to 'src/encoding/xml')
-rw-r--r--src/encoding/xml/xml.go14
1 files changed, 2 insertions, 12 deletions
diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go
index f408623de5..b379544dab 100644
--- a/src/encoding/xml/xml.go
+++ b/src/encoding/xml/xml.go
@@ -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