Switch kindToTypeMapping from map to array (#164)

Improve lookup performance by 8x.
This commit is contained in:
Jordan Krage
2017-05-25 11:02:42 -05:00
committed by Thomas Pelletier
parent 5c26a6ff6f
commit 048765b449
+12 -5
View File
@@ -6,10 +6,7 @@ import (
"time" "time"
) )
// supported values: var kindToType = [reflect.String + 1]reflect.Type{
// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32
var kindToTypeMapping = map[reflect.Kind]reflect.Type{
reflect.Bool: reflect.TypeOf(true), reflect.Bool: reflect.TypeOf(true),
reflect.String: reflect.TypeOf(""), reflect.String: reflect.TypeOf(""),
reflect.Float32: reflect.TypeOf(float64(1)), reflect.Float32: reflect.TypeOf(float64(1)),
@@ -26,6 +23,16 @@ var kindToTypeMapping = map[reflect.Kind]reflect.Type{
reflect.Uint64: reflect.TypeOf(uint64(1)), reflect.Uint64: reflect.TypeOf(uint64(1)),
} }
// typeFor returns a reflect.Type for a reflect.Kind, or nil if none is found.
// supported values:
// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32
func typeFor(k reflect.Kind) reflect.Type {
if k > 0 && int(k) < len(kindToType) {
return kindToType[k]
}
return nil
}
func simpleValueCoercion(object interface{}) (interface{}, error) { func simpleValueCoercion(object interface{}) (interface{}, error) {
switch original := object.(type) { switch original := object.(type) {
case string, bool, int64, uint64, float64, time.Time: case string, bool, int64, uint64, float64, time.Time:
@@ -82,7 +89,7 @@ func sliceToTree(object interface{}) (interface{}, error) {
return tablesArray, nil return tablesArray, nil
} }
sliceType := kindToTypeMapping[insideType.Kind()] sliceType := typeFor(insideType.Kind())
if sliceType == nil { if sliceType == nil {
sliceType = insideType sliceType = insideType
} }