mirror of
https://github.com/golang/go
synced 2024-11-23 05:10:09 -07:00
encoding/json: optimize Unmarshal for maps
benchmark old ns/op new ns/op delta BenchmarkUnmarshalMap-10 218 172 -21.28% benchmark old allocs new allocs delta BenchmarkUnmarshalMap-10 15 12 -20.00% benchmark old bytes new bytes delta BenchmarkUnmarshalMap-10 328 256 -21.95% Change-Id: Ie20ab62731c752eb0040c6d1591fedd7d12b1e0c Reviewed-on: https://go-review.googlesource.com/c/go/+/514100 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
bac4e2f241
commit
1eaeec1095
@ -385,6 +385,19 @@ func BenchmarkUnmarshalInt64(b *testing.B) {
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkUnmarshalMap(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
data := []byte(`{"key1":"value1","key2":"value2","key3":"value3"}`)
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
x := make(map[string]string, 3)
|
||||
for pb.Next() {
|
||||
if err := Unmarshal(data, &x); err != nil {
|
||||
b.Fatal("Unmarshal:", err)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkIssue10335(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
j := []byte(`{"a":{ }}`)
|
||||
|
@ -762,17 +762,17 @@ func (d *decodeState) object(v reflect.Value) error {
|
||||
if v.Kind() == reflect.Map {
|
||||
kt := t.Key()
|
||||
var kv reflect.Value
|
||||
switch {
|
||||
case reflect.PointerTo(kt).Implements(textUnmarshalerType):
|
||||
if reflect.PointerTo(kt).Implements(textUnmarshalerType) {
|
||||
kv = reflect.New(kt)
|
||||
if err := d.literalStore(item, kv, true); err != nil {
|
||||
return err
|
||||
}
|
||||
kv = kv.Elem()
|
||||
case kt.Kind() == reflect.String:
|
||||
kv = reflect.ValueOf(key).Convert(kt)
|
||||
default:
|
||||
} else {
|
||||
switch kt.Kind() {
|
||||
case reflect.String:
|
||||
kv = reflect.New(kt).Elem()
|
||||
kv.SetString(string(key))
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
s := string(key)
|
||||
n, err := strconv.ParseInt(s, 10, 64)
|
||||
@ -780,7 +780,8 @@ func (d *decodeState) object(v reflect.Value) error {
|
||||
d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)})
|
||||
break
|
||||
}
|
||||
kv = reflect.ValueOf(n).Convert(kt)
|
||||
kv = reflect.New(kt).Elem()
|
||||
kv.SetInt(n)
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||
s := string(key)
|
||||
n, err := strconv.ParseUint(s, 10, 64)
|
||||
@ -788,7 +789,8 @@ func (d *decodeState) object(v reflect.Value) error {
|
||||
d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)})
|
||||
break
|
||||
}
|
||||
kv = reflect.ValueOf(n).Convert(kt)
|
||||
kv = reflect.New(kt).Elem()
|
||||
kv.SetUint(n)
|
||||
default:
|
||||
panic("json: Unexpected key type") // should never occur
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user