我正在使用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)
}
通过进一步的实验,如果一个函数多次调用 non 可内联函数,则似乎不会内联。 (您可以对可内联函数进行大量调用,并且该函数仍将内联。)
答案 0 :(得分:0)
只需发布以下几点的答案(因为没有其他人知道)
- 尝试优化之前的基准测试。
- 看似简单的函数可能难以内联
- 内联正在发展,将来可能会内联