Простая функция не встроена - PullRequest
0 голосов
/ 31 октября 2019

Я добавляю вызовы метрик в свою программу Go, используя Prometheus. Я решил разделить все вызовы Prometheus на простые вызовы функций в отдельном исходном файле для удобства обслуживания (на случай, если я захочу перейти к другому пакету метрик). Но что более важно, это также ускоряет написание кода, поскольку среда IDE запрашивает имена меток в качестве параметров для вызова функции. Например, что-то вроде этого:

var requestCounter = promauto.NewCounterVec(prometheus.CounterOpts{}, []string{"name"})

func incrementRequestCounter(label1, label2 string) {
    requestCounter.WithLabelValues(label1, label2).Inc()
}

Некоторые из этих функций часто вызываются в низкоуровневом цикле, поэтому я не хочу, чтобы эти вызовы слишком сильно замедляли код. Я предполагал, что такую ​​простую строку кода будет легко встроить. Однако, проверяя (с опцией сборки --gcflags -m), я обнаружил, что вышеуказанная однострочная функция не встроена (go1.12.5 windows / amd64). Кто-нибудь знает почему? И как это обойти? Обратите внимание, что эта функция является встроенной:

func incrementRequestCounter(label1, label2 string) {
    requestCounter.WithLabelValues(label1, label2)
}

При дальнейшем экспериментировании кажется, что функция не будет встроенной, если она имеет более одного вызова не -линейных функций. (У вас может быть много вызовов встроенных функций, и функция все равно будет встроенной.)

1 Ответ

0 голосов
/ 05 ноября 2019

Просто отправьте ответ (так как никто другой не имеет) со следующими точками:

  1. Тест перед попыткой оптимизации.
  2. Кажущаяся простой функция может быть трудной для встраивания
  3. Инлайнинг развивается, и в будущем вышеперечисленное может быть встроено
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...