mirror of
https://github.com/spf13/viper
synced 2025-01-22 02:16:36 +00:00
Remove expensive TRACE logging
Also avoid doing a strings.Split in the Get common case. Any TRACE statements in these hot paths must be totally turned off when not testing. ``` benchmark old ns/op new ns/op delta BenchmarkGetBool-4 4090 409 -90.00% BenchmarkGetBoolFromMap-4 6.33 6.28 -0.79% benchmark old allocs new allocs delta BenchmarkGetBool-4 6 3 -50.00% BenchmarkGetBoolFromMap-4 0 0 +0.00% benchmark old bytes new bytes delta BenchmarkGetBool-4 129 33 -74.42% BenchmarkGetBoolFromMap-4 0 0 +0.00% ``` Fixes #242
This commit is contained in:
parent
438cc0d5c8
commit
382f87b929
3 changed files with 14 additions and 12 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -21,3 +21,4 @@ _testmain.go
|
||||||
|
|
||||||
*.exe
|
*.exe
|
||||||
*.test
|
*.test
|
||||||
|
*.bench
|
13
viper.go
13
viper.go
|
@ -463,12 +463,11 @@ func GetViper() *Viper {
|
||||||
// Get returns an interface. For a specific value use one of the Get____ methods.
|
// Get returns an interface. For a specific value use one of the Get____ methods.
|
||||||
func Get(key string) interface{} { return v.Get(key) }
|
func Get(key string) interface{} { return v.Get(key) }
|
||||||
func (v *Viper) Get(key string) interface{} {
|
func (v *Viper) Get(key string) interface{} {
|
||||||
path := strings.Split(key, v.keyDelim)
|
|
||||||
|
|
||||||
lcaseKey := strings.ToLower(key)
|
lcaseKey := strings.ToLower(key)
|
||||||
val := v.find(lcaseKey)
|
val := v.find(lcaseKey)
|
||||||
|
|
||||||
if val == nil {
|
if val == nil {
|
||||||
|
path := strings.Split(key, v.keyDelim)
|
||||||
source := v.find(strings.ToLower(path[0]))
|
source := v.find(strings.ToLower(path[0]))
|
||||||
if source != nil {
|
if source != nil {
|
||||||
if reflect.TypeOf(source).Kind() == reflect.Map {
|
if reflect.TypeOf(source).Kind() == reflect.Map {
|
||||||
|
@ -755,7 +754,6 @@ func (v *Viper) find(key string) interface{} {
|
||||||
// PFlag Override first
|
// PFlag Override first
|
||||||
flag, exists := v.pflags[key]
|
flag, exists := v.pflags[key]
|
||||||
if exists && flag.HasChanged() {
|
if exists && flag.HasChanged() {
|
||||||
jww.TRACE.Printf("%q found in pflag override (%s): %s", key, flag.ValueType(), flag.ValueString())
|
|
||||||
switch flag.ValueType() {
|
switch flag.ValueType() {
|
||||||
case "int", "int8", "int16", "int32", "int64":
|
case "int", "int8", "int16", "int32", "int64":
|
||||||
return cast.ToInt(flag.ValueString())
|
return cast.ToInt(flag.ValueString())
|
||||||
|
@ -771,7 +769,6 @@ func (v *Viper) find(key string) interface{} {
|
||||||
|
|
||||||
val, exists = v.override[key]
|
val, exists = v.override[key]
|
||||||
if exists {
|
if exists {
|
||||||
jww.TRACE.Printf("%q found in override: %s", key, val)
|
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -779,24 +776,19 @@ func (v *Viper) find(key string) interface{} {
|
||||||
// even if it hasn't been registered, if automaticEnv is used,
|
// even if it hasn't been registered, if automaticEnv is used,
|
||||||
// check any Get request
|
// check any Get request
|
||||||
if val = v.getEnv(v.mergeWithEnvPrefix(key)); val != "" {
|
if val = v.getEnv(v.mergeWithEnvPrefix(key)); val != "" {
|
||||||
jww.TRACE.Printf("%q found in environment: %s", key, val)
|
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
envkey, exists := v.env[key]
|
envkey, exists := v.env[key]
|
||||||
if exists {
|
if exists {
|
||||||
jww.TRACE.Printf("%q registered as env var %q", key, envkey)
|
|
||||||
if val = v.getEnv(envkey); val != "" {
|
if val = v.getEnv(envkey); val != "" {
|
||||||
jww.TRACE.Printf("%q found in environment: %s", envkey, val)
|
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
jww.TRACE.Printf("%q env value unset", envkey)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val, exists = v.config[key]
|
val, exists = v.config[key]
|
||||||
if exists {
|
if exists {
|
||||||
jww.TRACE.Printf("%q found in config (%T): %s", key, val, val)
|
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -809,7 +801,6 @@ func (v *Viper) find(key string) interface{} {
|
||||||
if reflect.TypeOf(source).Kind() == reflect.Map {
|
if reflect.TypeOf(source).Kind() == reflect.Map {
|
||||||
val := v.searchMap(cast.ToStringMap(source), path[1:])
|
val := v.searchMap(cast.ToStringMap(source), path[1:])
|
||||||
if val != nil {
|
if val != nil {
|
||||||
jww.TRACE.Printf("%q found in nested config: %s", key, val)
|
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -818,13 +809,11 @@ func (v *Viper) find(key string) interface{} {
|
||||||
|
|
||||||
val, exists = v.kvstore[key]
|
val, exists = v.kvstore[key]
|
||||||
if exists {
|
if exists {
|
||||||
jww.TRACE.Printf("%q found in key/value store: %s", key, val)
|
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
val, exists = v.defaults[key]
|
val, exists = v.defaults[key]
|
||||||
if exists {
|
if exists {
|
||||||
jww.TRACE.Printf("%q found in defaults: ", key, val)
|
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -919,6 +919,18 @@ func TestShadowedNestedValue(t *testing.T) {
|
||||||
assert.Equal(t, GetString("clothing.shirt"), polyester)
|
assert.Equal(t, GetString("clothing.shirt"), polyester)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetBool(t *testing.T) {
|
||||||
|
key := "BooleanKey"
|
||||||
|
v = New()
|
||||||
|
v.Set(key, true)
|
||||||
|
if !v.GetBool(key) {
|
||||||
|
t.Fatal("GetBool returned false")
|
||||||
|
}
|
||||||
|
if v.GetBool("NotFound") {
|
||||||
|
t.Fatal("GetBool returned true")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkGetBool(b *testing.B) {
|
func BenchmarkGetBool(b *testing.B) {
|
||||||
key := "BenchmarkGetBool"
|
key := "BenchmarkGetBool"
|
||||||
v = New()
|
v = New()
|
||||||
|
|
Loading…
Reference in a new issue