os.Getenv多少钱?

noa*_*amt -5 environment-variables go

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

for {
    myVar := os.Getenv("MY_VAR")
    //Do something
    time.Sleep(3 * time.Second)
}
Run Code Online (Sandbox Code Playgroud)

但是,重复拨打电话的费用是os.Getenv多少?

环境变量的值在运行时不会更改,因此我可以将其设置为程序包级变量:

package blah

var myVar = os.Getenv("MY_VAR")
Run Code Online (Sandbox Code Playgroud)

但这确实会损害代码的可测试性。

我应该将其设置为包级变量吗?还是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
}
Run Code Online (Sandbox Code Playgroud)
goos: darwin
goarch: amd64
BenchmarkEnv-8      20000000            78.7 ns/op
PASS
Run Code Online (Sandbox Code Playgroud)

Giu*_*oni 7

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

通过在此处查看其实现,它的成本为:

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