【问题标题】:How expensive is os.Getenv?os.Getenv 有多贵?
【发布时间】: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 基准测试功能是一件好事

标签: go environment-variables


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多