]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/xml: simplify slice-growing logic in rawToken
authorAlberto Donizetti <alb.donizetti@gmail.com>
Mon, 8 Jan 2018 12:03:57 +0000 (13:03 +0100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 19 Feb 2018 23:42:57 +0000 (23:42 +0000)
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>
src/encoding/xml/xml.go

index f408623de5ecbe2016ad5152477764d9e648b30a..b379544dab03a8e43830d58d58068c500e6d3d23 100644 (file)
@@ -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