🐯 摘要 嗨,猫头虎博主在此!今天我们将深入探讨2023年2月8日发布的Go语言新特性:Profile-Guided Optimization (PGO)。如果你对Go的性能优化感兴趣,那么本文将是你的不二之选。准备好了吗?让我们一起探索Go的这一新领域吧!
🐯 引言 在Go语言的世界里,每次编译都是一个提升性能的机会。从常量传播到逃逸分析,Go编译器不断地进行优化。随着Go 1.20的发布,我们迎来了PGO的初步支持,一个崭新的性能优化领域。
Go的编译器优化从版本到版本都在改进,但这并非易事。一些优化是可调的,但编译器不能仅仅“全力以赴”地优化每一个函数,因为过度的优化可能会损害性能或导致构建时间过长。而且,编译器在进行函数内部“常见”与“不常见”路径的判断时,必须基于静态启发式做出最佳猜测。
Go 1.20引入了PGO作为预览功能。通过profiling,我们可以为编译器提供在生产环境中代码的使用情况,从而使编译器能够做出更加明智的决策。
首先,我们来建立一个将Markdown转换为HTML的服务。这里是基本的设置步骤和main.go
的代码。
// 代码示例
接下来,我们构建并运行服务,使用Go提供的命令。
$ go build -o markdown.nopgo.exe
$ ./markdown.nopgo.exe
我们还需要从另一个终端发送一些Markdown样例。
$ curl -o README.md ...
现在我们有了一个运行中的服务,我们可以收集profile,并使用PGO重建,看看性能是否有所提升。
我们在main.go
中导入了net/http/pprof
,并通过以下步骤收集CPU profile。
$ curl -o cpu.pprof ...
我们使用-pgo
标志来构建PGO。
$ go build -pgo=auto -o markdown.withpgo.exe
接下来,我们使用Go的benchmark工具来评估PGO对性能的影响。
我们分别对没有使用PGO和使用了PGO的服务器进行了基准测试。
$ go test ...
最后,我们使用benchstat
来比较两种情况下的性能。
$ benchstat nopgo.txt withpgo.txt
PGO的使用在Go 1.20中通常可以在CPU使用方面带来2%到4%的改进。
通过PGO,我们可以使Go的应用程序性能得到进一步的提升。虽然目前PGO还在预览阶段,但它已经展现
出巨大的潜力。不要忘了,这篇文章已被猫头虎的Go生态洞察专栏收录,详情点击这里。
🐾 参考资料