diff options
| author | Filip Gruszczyński <gruszczy@gmail.com> | 2017-03-15 20:11:30 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2017-03-24 19:36:14 +0000 |
| commit | 0b9607d1d648ae77d2db86a991db4a1fe921dbd8 (patch) | |
| tree | 3ee71a3482420dd956c72904c97e6dc1bef7ac58 /src/encoding/gob/codec_test.go | |
| parent | f1e880386b668a26dd6b7afdea43c9041a917fa5 (diff) | |
| download | go-0b9607d1d648ae77d2db86a991db4a1fe921dbd8.tar.xz | |
encoding/gob: Speedup map decoding by reducing the allocations.
The improvementis achieved in encoding/gob/decode.go decodeMap by
allocate keyInstr and elemInstr only once and pass it to
decodeIntoValue, instead of allocating a new instance on every loop
cycle.
name old time/op new time/op delta
DecodeComplex128Slice-8 64.2µs ±10% 62.2µs ± 8% ~ (p=0.686 n=4+4)
DecodeFloat64Slice-8 37.1µs ± 3% 36.5µs ± 5% ~ (p=0.343 n=4+4)
DecodeInt32Slice-8 33.7µs ± 3% 32.7µs ± 4% ~ (p=0.200 n=4+4)
DecodeStringSlice-8 59.7µs ± 5% 57.3µs ± 1% ~ (p=0.114 n=4+4)
DecodeInterfaceSlice-8 543µs ± 7% 497µs ± 3% ~ (p=0.057 n=4+4)
DecodeMap-8 3.78ms ± 8% 2.66ms ± 2% -29.69% (p=0.029 n=4+4)
Updates #19525
Change-Id: Iec5fa4530de76f0a70da5de8a129a567b4aa096e
Reviewed-on: https://go-review.googlesource.com/38317
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/encoding/gob/codec_test.go')
| -rw-r--r-- | src/encoding/gob/codec_test.go | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/encoding/gob/codec_test.go b/src/encoding/gob/codec_test.go index d4002cbcca..31c6aa6dd7 100644 --- a/src/encoding/gob/codec_test.go +++ b/src/encoding/gob/codec_test.go @@ -545,11 +545,16 @@ func TestEndToEnd(t *testing.T) { type T2 struct { T string } + type T3 struct { + X float64 + Z *int + } s1 := "string1" s2 := "string2" type T1 struct { A, B, C int M map[string]*float64 + M2 map[int]T3 EmptyMap map[string]int // to check that we receive a non-nil map. N *[3]float64 Strs *[2]string @@ -561,11 +566,14 @@ func TestEndToEnd(t *testing.T) { } pi := 3.14159 e := 2.71828 + meaning := 42 + fingers := 5 t1 := &T1{ A: 17, B: 18, C: -5, M: map[string]*float64{"pi": &pi, "e": &e}, + M2: map[int]T3{4: T3{X: pi, Z: &meaning}, 10: T3{X: e, Z: &fingers}}, EmptyMap: make(map[string]int), N: &[3]float64{1.5, 2.5, 3.5}, Strs: &[2]string{s1, s2}, |
