超出在线预算
Exceeding inline budget
如果函数不被内联的唯一原因是超过内联预算,你能强制 Golang 编译器内联函数吗?没有延迟,也没有任何其他语句阻止编译器内联函数——只有预算限制。或者,如果不能,是否可以将预算从 80 更改为 160?或者您是否知道任何可以帮助我以某种方式拆分它的模式。
我有这样的功能:
func New() *Foo{
f := &Foo{}
f.Init()
return f
}
它有点复杂,所以它超过了 80 预算 - 因此,它比它应该慢 10 倍。它应该是内联的,但不是手动的,这样编译器也可以应用一些优化。
如您所知,简短的回答是“不,不是不修改编译器”,但这在未来可能会改变。 Uber 一直致力于以配置文件为导向的优化,今天 发布了 a pull request containing that work。这需要一些时间来消化(我在编译器上工作,我们正在努力为 1.18 版本做好准备,这很大,因为它包含 generics)但可以肯定地说我们很感兴趣。这最快可能出现在 1.19 中,计划从现在开始 8 个月后。
根据导致速度变慢的原因,标记 f.Init()
//go:noinline
可能有利可图,这样可以内联示例中的 New
。如果该分配没有泄漏到调用者的堆中,那么内联(而不是内联 f.Init()
)会暴露进行堆栈分配的能力,您可以通过这种方式节省一些时间。一定要用注释标记“noinline”,解释你这样做的原因:-)。
您也可以修改编译器,但您没有从我这里听说过(默认情况下,您报告的针对修改过的编译器的任何错误都会引起注意)。
如果函数不被内联的唯一原因是超过内联预算,你能强制 Golang 编译器内联函数吗?没有延迟,也没有任何其他语句阻止编译器内联函数——只有预算限制。或者,如果不能,是否可以将预算从 80 更改为 160?或者您是否知道任何可以帮助我以某种方式拆分它的模式。
我有这样的功能:
func New() *Foo{
f := &Foo{}
f.Init()
return f
}
它有点复杂,所以它超过了 80 预算 - 因此,它比它应该慢 10 倍。它应该是内联的,但不是手动的,这样编译器也可以应用一些优化。
如您所知,简短的回答是“不,不是不修改编译器”,但这在未来可能会改变。 Uber 一直致力于以配置文件为导向的优化,今天 发布了 a pull request containing that work。这需要一些时间来消化(我在编译器上工作,我们正在努力为 1.18 版本做好准备,这很大,因为它包含 generics)但可以肯定地说我们很感兴趣。这最快可能出现在 1.19 中,计划从现在开始 8 个月后。
根据导致速度变慢的原因,标记 f.Init()
//go:noinline
可能有利可图,这样可以内联示例中的 New
。如果该分配没有泄漏到调用者的堆中,那么内联(而不是内联 f.Init()
)会暴露进行堆栈分配的能力,您可以通过这种方式节省一些时间。一定要用注释标记“noinline”,解释你这样做的原因:-)。
您也可以修改编译器,但您没有从我这里听说过(默认情况下,您报告的针对修改过的编译器的任何错误都会引起注意)。