Comment on page
8.4.4 编译日志
编译器提供了参数来反馈编译过程中的各种优化:
-json stringversion,file for JSON compiler/optimizer detail output-m print optimization decisions
我们可以通过以上参数来查看编译器所做的各种优化,包括内联在内。将下列代码保存为
main.go
:package main
func C() {
println("C")
D()
}
func D() {
println("D")
C()
}
func main() {
C()
}
通过命令
go tool compile -G=3 -m -json "0,file:///tmp/main.json" main.go
进行编译,可以看到如下输出:main.go:3:6: can inline Cmain.go:8:6: can inline Dmain.go:10:3: inlining call to Cmain.go:13:6: can inline mainmain.go:14:3: inlining call to Cmain.go:14:3: inlining call to D
文件
/tmp/main.json
也会包含相关信息。其中 -m
对应的数字越大,日志就越详细,例如我们通过命令 go tool compile -G=3 -m=2 -json "0,file:///tmp/main.json" main.go
编译时,得到的结果如下:main.go:3:6: can inline C with cost 61 as: func() { println(string(“C”)); D() }main.go:8:6: can inline D with cost 65 as: func() { println(string(“D”)); C() }main.go:10:3: inlining call to C func() { println(string(“C”)); D() }main.go:13:6: can inline main with cost 63 as: func() { C() }main.go:14:3: inlining call to C func() { println(string(“C”)); D() }main.go:14:3: inlining call to D func() { println(string(“D”)); C() }main.go:14:3: cannot inline C into main: repeated recursive cycle
其中
-m -m
与 -m=2
效果一样,当 -m=4
时,日志还会打印出内联前后的 IR Tree 结构,读者可以自己尝试。