]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/xml: avoid an allocation for tags without attributes
authorBrian Smith <ohohvi@gmail.com>
Sat, 7 Feb 2015 03:51:13 +0000 (03:51 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 7 Feb 2015 22:09:03 +0000 (22:09 +0000)
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/4160
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/encoding/xml/xml.go

index 5690b20256d2ea8731c1063a0ec9ea18f66ca22a..e9535d7b55f88f32806a10845b1d98c3e202bf5e 100644 (file)
@@ -723,7 +723,7 @@ func (d *Decoder) rawToken() (Token, error) {
                return nil, d.err
        }
 
-       attr = make([]Attr, 0, 4)
+       attr = []Attr{}
        for {
                d.space()
                if b, ok = d.mustgetc(); !ok {
@@ -747,7 +747,11 @@ func (d *Decoder) rawToken() (Token, error) {
 
                n := len(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)
                        attr = nattr
                }