内联,就是将一个函数调用原地展开,替换成这个函数的实现。尽管这样做会增加编译后二进制文件的大小,但是它可以提高程序的性能。内联是高性能编程的一种重要手段。每个函数调用都有开销:创建栈帧,读写寄存器,这些开销可以通过内联避免。如果一个函数足够小,那调用这个函数的开销就显得昂贵,对于大函数编译器也会直接调用,放弃内联。
使用 go build -gcflags="-m" xxx.go 可显示被内联的函数
使用 go build -gcflags="-m -m" xxx.go可以看到为什么没有被内联原因:
包含以下内容的方法都不会被内联:闭包调用,select,for,defer,go关键字创建的协程。并且除了这些,还有其它的限制。当解析AST时,Go申请了80个节点作为内联的预算。当一个函数的开销超过了这个预算,就无法内联。