У меня есть фрагмент кода, который вызывается каждые несколько секунд и использует переменную среды:
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.
: Почему? Если вам нужна переменная уровня пакета, используйте ее. Из вашего примера у вас также, очевидно, есть выбор вне цикла, так зачем искать его каждый раз?
@JimB Параллелизм здесь не проблема, но он ограничивает возможности тестирования
@ServeLaurijssen Это возможно и легко в приведенном мною упрощенном примере, но это усложнит реальный код, над которым я работаю, поэтому я ищу способы обойти это.
неудобно, что этот вопрос был отмечен; направлять любознательных разработчиков к возможностям бенчмарка golang — это хорошо
Вы можете протестировать os.Getenv и посмотреть, насколько он быстр.
Глядя на его реализацию здесь, стоит:
Вы можете сравнить это и узнать. Мой прогноз: это достаточно быстро, чтобы не волноваться.