os.Getenv多少钱?

时间:2019-05-28 14:24:31

标签: go environment-variables

我有一段代码每隔几秒钟被调用一次,并且使用了一个环境变量:

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

1 个答案:

答案 0 :(得分:7)

您可以对os.Getenv进行基准测试,看看它有多快。

通过查看其实现here,它的成本为:

  1. 读锁;
  2. 在全球地图中查找;
  3. 线性搜索char'='。