Go glolang编译器中的空函数优化
golang编译器是否优化空函数 我希望在构建产品时从main.go中删除调试日志代码行 梅因,加油Go glolang编译器中的空函数优化,go,compiler-optimization,Go,Compiler Optimization,golang编译器是否优化空函数 我希望在构建产品时从main.go中删除调试日志代码行 梅因,加油 func main(){ logging.DebugLog(“嘿%d”,123) } 调试模式 /+builddev 包日志记录 进口( “fmt” ) func调试日志(模式字符串、参数…接口{}){ msg:=fmt.Sprintf(模式、参数…) fmt.Printf(“调试:%s\n”,msg) } 生产方式, /+build!发展 包日志记录 进口( “fmt” ) func De
func main(){
logging.DebugLog(“嘿%d”,123)
}
调试模式
/+builddev
包日志记录
进口(
“fmt”
)
func调试日志(模式字符串、参数…接口{}){
msg:=fmt.Sprintf(模式、参数…)
fmt.Printf(“调试:%s\n”,msg)
}
生产方式,
/+build!发展
包日志记录
进口(
“fmt”
)
func DebugLog(模式字符串,args…接口{}){
golang编译器是否在编译时从主函数中删除DebugLog函数行?或者干脆离开并在运行时执行?让我详细回答这个问题 答案是肯定的,至少是golang编译器的某个版本 试验台 go版本go1.13.15 linux/amd64 cat./main.go
package main
import (
"./fc"
)
func main() {
fc.Dosome()
}
cat./fc/funcdummy.go
// +build !dev
package fc
func Dosome() {
}
目录/fc/func.go
// +build dev
package fc
import (
"fmt"
)
func Dosome() {
fmt.Println("hello world")
}
结果
grep'Dosome'-a5-b5./dumphavetag
0x48cf69 483b6110 CMPQ 0x10(CX), SP
0x48cf6d 7670 JBE 0x48cfdf
0x48cf6f 4883ec58 SUBQ $0x58, SP
0x48cf73 48896c2450 MOVQ BP, 0x50(SP)
0x48cf78 488d6c2450 LEAQ 0x50(SP), BP
fc.Dosome()
0x48cf7d 0f57c0 XORPS X0, X0
fmt.Println("hello world")
0x48cf80 0f11442440 MOVUPS X0, 0x40(SP)
0x48cf85 488d0554120100 LEAQ 0x11254(IP), AX
0x48cf8c 4889442440 MOVQ AX, 0x40(SP)
grep'Dosome'-a5-b5./dumpnotag
//empty
所以,我们可以看到,空函数得到了优化,golang编译器没有更多的编译标志
更多
我发现这是相关的,所以你需要go compile的现代版本。你可以得到你想要的
我们现在进行整个子树内联和死代码消除
编译器可能会将函数内联。一般来说,这很难说清楚。想象一个调用,比如
DebugLog(“foo”,f())
。如果f
有副作用,至少不能放弃对f的调用。这种优化通常随编译器版本的不同而变化。查看生成的程序集。请注意,编译器不能删除main中的函数调用(尽管是内联的),我怀疑当前链接器是否会删除它。您确实应该检查生成的可执行文件。请尝试使用objdump工具
//empty