go - 不内联简单函数

标签 go inline

我正在使用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/

    相关文章:

    go - 如何从 tinygo webassembly 目标返回对象

    c++ - 我们可以强制函数在 C++ 中内联吗

    html - 布局。两个包含内容的内联框,其中一个框被分成其他框

    CSS:内联和外部样式表的平衡?

    go - Sync.WaitGroup,为什么在 goroutine 中更接近

    go - 如何有效地对文件进行多次写入

    dictionary - panic : assignment to entry in nil map on single simple map

    OpenCV 相当于 np.where()

    html - 为 Gmail 构建电子邮件,我的 <img> 一直设置为隐藏

    c++ - 为什么内联被认为比函数调用更快?