1
0
mirror of https://github.com/golang/go synced 2024-11-23 09:40:04 -07:00

encoding/gob: optimize decoding of slice

In CL 345572, we used the reflect.Value.SetLen method to avoid
extra memory allocation for reflect.Value.Slice.
This also applies to function decodeSlice

name                   old time/op    new time/op    delta
DecodeStringsSlice-12    96.5µs ±12%    63.0µs ± 8%  -34.68%  (p=0.000 n=9+10)

name                   old alloc/op   new alloc/op   delta
DecodeStringsSlice-12    89.3kB ± 0%    65.3kB ± 0%  -26.89%  (p=0.000 n=10+10)

name                   old allocs/op  new allocs/op  delta
DecodeStringsSlice-12     3.18k ± 0%     2.18k ± 0%  -31.47%  (p=0.000 n=10+10)

Change-Id: Ifdb43716cc90a265962dec022704a5571f447fd8
Reviewed-on: https://go-review.googlesource.com/c/go/+/347533
Reviewed-by: Joe Tsai <joetsai@digital-static.net>
Reviewed-by: Rob Pike <r@golang.org>
Trust: Joe Tsai <joetsai@digital-static.net>
Run-TryBot: Joe Tsai <joetsai@digital-static.net>
TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
korzhao 2021-09-03 15:55:16 +08:00 committed by Ian Lance Taylor
parent 80783558b0
commit dcf3545774
2 changed files with 8 additions and 2 deletions

View File

@ -625,7 +625,7 @@ func (dec *Decoder) decodeSlice(state *decoderState, value reflect.Value, elemOp
if value.Cap() < n { if value.Cap() < n {
value.Set(reflect.MakeSlice(typ, n, n)) value.Set(reflect.MakeSlice(typ, n, n))
} else { } else {
value.Set(value.Slice(0, n)) value.SetLen(n)
} }
dec.decodeArrayHelper(state, value, elemOp, n, ovfl, helper) dec.decodeArrayHelper(state, value, elemOp, n, ovfl, helper)
} }

View File

@ -279,7 +279,13 @@ func BenchmarkDecodeStringSlice(b *testing.B) {
} }
benchmarkDecodeSlice(b, a) benchmarkDecodeSlice(b, a)
} }
func BenchmarkDecodeStringsSlice(b *testing.B) {
a := make([][]string, 1000)
for i := range a {
a[i] = []string{"now is the time"}
}
benchmarkDecodeSlice(b, a)
}
func BenchmarkDecodeBytesSlice(b *testing.B) { func BenchmarkDecodeBytesSlice(b *testing.B) {
a := make([][]byte, 1000) a := make([][]byte, 1000)
for i := range a { for i := range a {