【发布时间】:2019-05-28 14:24:30
【问题描述】:
我有一段代码每隔几秒调用一次并使用环境变量:
for {
myVar := os.Getenv("MY_VAR")
//Do something
time.Sleep(3 * time.Second)
}
但是重复调用os.Getenv 的成本有多大?
环境变量的值在运行时不会改变,所以我可以将它设置为包级变量:
package blah
var myVar = os.Getenv("MY_VAR")
但这确实会损害代码的可测试性。
我应该将它设置为包级变量吗?还是os.Getenv足够良性?
编辑:
我已经对os.Getenv 的调用进行了基准测试,但它可靠吗?
package main_test
import (
"os"
"testing"
)
var result string
func BenchmarkEnv(b *testing.B) {
var r string
for n := 0; n < b.N; n++ {
r = os.Getenv("PATH")
}
result = r
}
goos: darwin
goarch: amd64
BenchmarkEnv-8 20000000 78.7 ns/op
PASS
【问题讨论】:
-
您可以对此进行基准测试并找出答案。我的预测:它足够快,不用在意。
-
不改为什么还要反复阅读?
-
在循环之前阅读它?
-
But to my understanding we should avoid package level variables.:为什么?如果您需要一个包级变量,请使用一个。从您的示例中,您显然也可以选择将其范围设置在循环之外,那么为什么每次都查找它呢? -
对这个问题被标记下感到不舒服;引导好奇的开发人员使用 golang 基准测试功能是一件好事