gpt4 book ai didi

go - glolang编译器中的空函数优化

转载 作者:行者123 更新时间:2023-12-03 10:09:36 25 4
gpt4 key购买 nike

golang编译器是否优化空函数?

我希望在构建生产时从main.go中删除调试日志代码行

main.go

func main() {
logging.DebugLog("hey %d", 123)
}

Debug模式,

// +build dev
package logging

import (
"fmt"
)

func DebugLog(pattern string, args... interface{}) {
msg := fmt.Sprintf(pattern, args...)
fmt.Printf("debug: %s\n", msg)
}

生产模式

// +build !dev
package logging

import (
"fmt"
)

func DebugLog(pattern string, args... interface{}) {}

Golang编译器会在编译时从主函数中删除DebugLog函数行吗?或者只是离开并在运行时间执行?

最佳答案

让我详细回答。
答案是肯定的,至少是某些版本的golang编译器。
试验台
go版本go1.13.15 linux/amd64
猫./main.go

package main

import (
"./fc"
)

func main() {
fc.Dosome()
}
猫./fc/funcdummy.go
// +build !dev

package fc

func Dosome() {
}
猫./fc/func.go
// +build dev

package fc

import (
"fmt"
)

func Dosome() {
fmt.Println("hello world")
}
go build -tags dev -o ./havetag ./main.go
go build -o ./notag ./main.go
go tool objdump -S ./notag > ./dumpnotag
go tool objdump -S ./havetag > ./dumphavetag
结果
grep'Dosome'-A 5 -B 5 ./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'-A 5 -B 5 ./dumpnotag
//empty
因此,我们可以看到,对空函数进行了优化,而没有更多用于golang编译器的编译标志。
更多的
我发现这与 issue有关,因此您需要现代版本的go compile。你可以得到你所得到的。

We now do whole subtree inlining, and dead code elimination.

关于go - glolang编译器中的空函数优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61400842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com