]> Cypherpunks repositories - gostls13.git/commit
encoding/json: various minor decoder speed-ups
authorDaniel Martí <mvdan@mvdan.cc>
Sun, 8 Jul 2018 15:14:35 +0000 (16:14 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Tue, 21 Aug 2018 19:00:08 +0000 (19:00 +0000)
commit6d4787aff205c242895bb072a18f9066a00d00b3
treeeb2804d4e598ab1c43fd0c6d8fe65bc14f052830
parent9a2a34e1c1be53fce0782a0b5e14e6f7ceaad62a
encoding/json: various minor decoder speed-ups

Reuse v.Type() and cachedTypeFields(t) when decoding maps and structs.

Always use the same data slices when in hot loops, to ensure that the
compiler generates good code. "for i < len(data) { use(d.data[i]) }"
makes it harder for the compiler.

Finally, do other minor clean-ups, such as deduplicating switch cases,
and using a switch instead of three chained ifs.

The decoder sees a noticeable speed-up, in particular when decoding
structs.

name           old time/op    new time/op    delta
CodeDecoder-4    29.8ms ± 1%    27.5ms ± 0%  -7.83%  (p=0.002 n=6+6)

name           old speed      new speed      delta
CodeDecoder-4  65.0MB/s ± 1%  70.6MB/s ± 0%  +8.49%  (p=0.002 n=6+6)

Updates #5683.

Change-Id: I9d751e22502221962da696e48996ffdeb777277d
Reviewed-on: https://go-review.googlesource.com/122468
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/encoding/json/decode.go
src/encoding/json/stream.go