我正在使用Prometheus向我的Go程序添加指标调用。我决定将所有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)
}
经过进一步的试验,如果一个函数对和可内联函数的调用不止一个,则似乎不会内联。 (您可以多次调用可内联函数,并且该函数仍将内联。)
最佳答案
只需发布以下几点的答案(因为没有其他人有):
关于go - 不内联简单函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58640486/