Specialize map[string]iface when unmarshaling kvs
name old time/op new time/op delta UnmarshalDataset/config-8 12.3ms ± 0% 10.9ms ± 0% -11.36% (p=0.008 n=5+5) UnmarshalDataset/canada-8 55.2ms ± 0% 55.4ms ± 1% ~ (p=0.690 n=5+5) UnmarshalDataset/citm_catalog-8 16.5ms ± 1% 15.7ms ± 0% -4.43% (p=0.008 n=5+5) UnmarshalDataset/twitter-8 7.01ms ± 1% 6.63ms ± 0% -5.34% (p=0.008 n=5+5) UnmarshalDataset/code-8 52.0ms ± 0% 48.7ms ± 2% -6.43% (p=0.008 n=5+5) UnmarshalDataset/example-8 119µs ± 0% 110µs ± 3% -6.81% (p=0.008 n=5+5) Unmarshal/SimpleDocument/struct-8 432ns ± 1% 431ns ± 1% ~ (p=0.222 n=5+5) Unmarshal/SimpleDocument/map-8 573ns ± 1% 540ns ± 1% -5.64% (p=0.008 n=5+5) Unmarshal/ReferenceFile/struct-8 33.7µs ± 0% 33.6µs ± 0% ~ (p=0.310 n=5+5) Unmarshal/ReferenceFile/map-8 44.2µs ± 1% 41.7µs ± 1% -5.63% (p=0.008 n=5+5) Unmarshal/HugoFrontMatter-8 7.28µs ± 1% 6.74µs ± 1% -7.42% (p=0.008 n=5+5) [Geo mean] 292µs 277µs -4.91% name old speed new speed delta UnmarshalDataset/config-8 85.2MB/s ± 0% 96.1MB/s ± 0% +12.82% (p=0.008 n=5+5) UnmarshalDataset/canada-8 39.9MB/s ± 0% 39.8MB/s ± 1% ~ (p=0.690 n=5+5) UnmarshalDataset/citm_catalog-8 33.9MB/s ± 1% 35.5MB/s ± 0% +4.64% (p=0.008 n=5+5) UnmarshalDataset/twitter-8 63.1MB/s ± 1% 66.6MB/s ± 0% +5.65% (p=0.008 n=5+5) UnmarshalDataset/code-8 51.6MB/s ± 0% 55.1MB/s ± 2% +6.88% (p=0.008 n=5+5) UnmarshalDataset/example-8 68.3MB/s ± 0% 73.4MB/s ± 3% +7.34% (p=0.008 n=5+5) Unmarshal/SimpleDocument/struct-8 25.4MB/s ± 1% 25.5MB/s ± 1% ~ (p=0.246 n=5+5) Unmarshal/SimpleDocument/map-8 19.2MB/s ± 1% 20.4MB/s ± 1% +5.99% (p=0.008 n=5+5) Unmarshal/ReferenceFile/struct-8 156MB/s ± 0% 156MB/s ± 0% ~ (p=0.310 n=5+5) Unmarshal/ReferenceFile/map-8 119MB/s ± 1% 126MB/s ± 1% +5.97% (p=0.008 n=5+5) Unmarshal/HugoFrontMatter-8 75.0MB/s ± 1% 81.0MB/s ± 1% +8.01% (p=0.008 n=5+5) [Geo mean] 56.1MB/s 59.0MB/s +5.17% name old alloc/op new alloc/op delta UnmarshalDataset/config-8 5.26MB ± 0% 4.75MB ± 0% -9.66% (p=0.008 n=5+5) UnmarshalDataset/canada-8 83.0MB ± 0% 83.0MB ± 0% -0.00% (p=0.008 n=5+5) UnmarshalDataset/citm_catalog-8 34.7MB ± 0% 34.3MB ± 0% -1.13% (p=0.008 n=5+5) UnmarshalDataset/twitter-8 12.7MB ± 0% 12.5MB ± 0% -1.44% (p=0.008 n=5+5) UnmarshalDataset/code-8 15.3MB ± 0% 13.9MB ± 0% -9.27% (p=0.008 n=5+5) UnmarshalDataset/example-8 186kB ± 0% 182kB ± 0% -2.20% (p=0.008 n=5+5) Unmarshal/SimpleDocument/struct-8 805B ± 0% 805B ± 0% ~ (all equal) Unmarshal/SimpleDocument/map-8 1.13kB ± 0% 1.12kB ± 0% -1.41% (p=0.008 n=5+5) Unmarshal/ReferenceFile/struct-8 20.9kB ± 0% 20.9kB ± 0% ~ (all equal) Unmarshal/ReferenceFile/map-8 36.4kB ± 0% 35.4kB ± 0% ~ (p=0.079 n=4+5) Unmarshal/HugoFrontMatter-8 7.20kB ± 0% 6.98kB ± 0% -3.11% (p=0.008 n=5+5) [Geo mean] 312kB 303kB -2.86% name old allocs/op new allocs/op delta UnmarshalDataset/config-8 189k ± 0% 157k ± 0% -16.80% (p=0.029 n=4+4) UnmarshalDataset/canada-8 782k ± 0% 782k ± 0% -0.00% (p=0.008 n=5+5) UnmarshalDataset/citm_catalog-8 191k ± 0% 167k ± 0% -12.75% (p=0.000 n=4+5) UnmarshalDataset/twitter-8 56.9k ± 0% 45.5k ± 0% -20.02% (p=0.016 n=5+4) UnmarshalDataset/code-8 626k ± 0% 537k ± 0% -14.22% (p=0.008 n=5+5) UnmarshalDataset/example-8 1.36k ± 0% 1.11k ± 0% -18.53% (p=0.008 n=5+5) Unmarshal/SimpleDocument/struct-8 9.00 ± 0% 9.00 ± 0% ~ (all equal) Unmarshal/SimpleDocument/map-8 13.0 ± 0% 12.0 ± 0% -7.69% (p=0.008 n=5+5) Unmarshal/ReferenceFile/struct-8 183 ± 0% 183 ± 0% ~ (all equal) Unmarshal/ReferenceFile/map-8 526 ± 0% 466 ± 0% -11.41% (p=0.008 n=5+5) Unmarshal/HugoFrontMatter-8 126 ± 0% 112 ± 0% -11.11% (p=0.008 n=5+5) [Geo mean] 3.73k 3.34k -10.51%
This commit is contained in:
+44
-3
@@ -391,6 +391,44 @@ func (d *decoder) handleArrayTableCollection(key ast.Iterator, v reflect.Value)
|
||||
return d.handleArrayTable(key, v)
|
||||
}
|
||||
|
||||
func (d *decoder) handleKeyValuePartMapStringInterface(key ast.Iterator, value *ast.Node, m map[string]interface{}) (reflect.Value, error) {
|
||||
k := string(key.Node().Data)
|
||||
|
||||
newMap := false
|
||||
if m == nil {
|
||||
newMap = true
|
||||
m = make(map[string]interface{}, 8)
|
||||
}
|
||||
|
||||
set := false
|
||||
v, ok := m[k]
|
||||
if !ok || key.IsLast() {
|
||||
set = true
|
||||
v = nil
|
||||
}
|
||||
|
||||
mv := reflect.ValueOf(&v).Elem()
|
||||
|
||||
x, err := d.handleKeyValueInner(key, value, mv)
|
||||
if err != nil {
|
||||
return reflect.Value{}, err
|
||||
}
|
||||
if x.IsValid() {
|
||||
mv = x
|
||||
set = true
|
||||
}
|
||||
|
||||
if set {
|
||||
m[k] = mv.Interface()
|
||||
}
|
||||
|
||||
if newMap {
|
||||
return reflect.ValueOf(m), nil
|
||||
}
|
||||
|
||||
return reflect.Value{}, nil
|
||||
}
|
||||
|
||||
func (d *decoder) handleKeyPartMapStringInterface(key ast.Iterator, m map[string]interface{}, nextFn handlerFn, makeFn valueMakerFn) (reflect.Value, error) {
|
||||
newMap := false
|
||||
|
||||
@@ -1035,6 +1073,11 @@ func (d *decoder) handleKeyValuePart(key ast.Iterator, value *ast.Node, v reflec
|
||||
case reflect.Map:
|
||||
vt := v.Type()
|
||||
|
||||
if vt == mapStringInterfaceType {
|
||||
m := v.Interface().(map[string]interface{})
|
||||
return d.handleKeyValuePartMapStringInterface(key, value, m)
|
||||
}
|
||||
|
||||
mk := reflect.ValueOf(string(key.Node().Data))
|
||||
mkt := stringType
|
||||
|
||||
@@ -1058,13 +1101,11 @@ func (d *decoder) handleKeyValuePart(key ast.Iterator, value *ast.Node, v reflec
|
||||
if !mv.IsValid() {
|
||||
set = true
|
||||
mv = reflect.New(v.Type().Elem()).Elem()
|
||||
} else {
|
||||
if key.IsLast() {
|
||||
} else if key.IsLast() {
|
||||
var x interface{}
|
||||
mv = reflect.ValueOf(&x).Elem()
|
||||
set = true
|
||||
}
|
||||
}
|
||||
|
||||
nv, err := d.handleKeyValueInner(key, value, mv)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user