如何使用环境变量来优化 go 二进制文件?
例如,使用 C 和 GCC,您将设置CFLAGS="-O2 -march=znver1
为使用第 2 层优化进行构建,并针对 Zen 微架构进行特定优化。我在 Golang 的文档中找不到等效的环境变量。
Go 确实提供了一种禁用它们的方法,但不指定使用哪一个,以防您使用 gccgo 作为编译器后端。因此,它与一般关于 Go 优化标志的其他问题非常不同(例如,将优化标志传递给 Go 编译器?)
如何使用环境变量来优化 go 二进制文件?
例如,使用 C 和 GCC,您将设置CFLAGS="-O2 -march=znver1
为使用第 2 层优化进行构建,并针对 Zen 微架构进行特定优化。我在 Golang 的文档中找不到等效的环境变量。
Go 确实提供了一种禁用它们的方法,但不指定使用哪一个,以防您使用 gccgo 作为编译器后端。因此,它与一般关于 Go 优化标志的其他问题非常不同(例如,将优化标志传递给 Go 编译器?)
找了很久,终于找到了我需要的资料。首先,正如Adrian所提到的,标准的 gc 编译器(通常是最新的 Go 规范)不支持优化标志(除了使用这里提到的完全-N -l
禁用它们。
但是,如果您使用 GCCGO,则可以使用一个环境变量,即GOGCCFLAGS
. 在安装了 gcc-go 的系统上使用go env
,我看到它的默认值为-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build920233973=/tmp/go-build -gno-record-gcc-switches -funwind-tables
. 因此,可以覆盖此环境变量并传递其他优化,如GCCGO 文档中描述的那些。标准 gcc 选项似乎可以工作,-march=native
例如,这正是我正在寻找的。
编辑:经过更多测试,似乎 Go 经常忽略这个环境变量,所以你必须添加-gccgoflags="${GOGCCFLAGS}"
.
编辑 25/01/2022:从 Go 1.18 开始,GOAMD64
添加了环境变量,允许您选择目标x86_64
功能级别(从v1
到v4
)。默认值为GOAMD64=v1
,但如果您知道您只会针对比Sandy Brige或Bulldozer更新的 CPU ,您可以安全地使用它GOAMD64=v2
来获得一些性能。
ARM 也存在类似的环境变量。您可以在此处了解更多详细信息:https ://github.com/golang/go/wiki/MinimumRequirements#microarchitecture-support