前言
Go官网团队在2022.12.08公布了Go 1.20 rc1(release candidate)版本,Go 1.20的正式release版本预计会在2023年2月份公布。
让咱们先睹为快,看看Go 1.20给咱们带来了哪些变动。
装置办法:
$ go install golang.org/dl/go1.20rc1@latest$ go1.20rc1 download
这是Go 1.20版本更新内容详解的第3篇,欢送大家关注公众号,及时获取本系列最新更新。
Go 1.20公布清单
和Go 1.19相比,改变内容适中,次要波及语言(Language)、可移植性(Ports)、工具链(Go Tools)、运行时(Runtime)、编译器(Compiler)、汇编器(Assembler)、链接器(Linker)和外围库(Core library)等方面的优化。
第1篇次要波及Go 1.20在语言、可移植性方面的优化,原文链接:Go 1.20版本升级内容第1篇。
第2篇次要波及Go命令和工具链方面的优化,原文链接:Go 1.20版本升级内容第2篇。
本文重点介绍Go 1.20在运行时、编译器、汇编器和链接器等方面的优化。
Runtime
Go 1.20版本的运行时新增了arena内存调配这个新性能的实验性反对,能够让Go程序开释更多内存空间,节俭内存占用。
想理解什么是arena内存调配的,能够参考:https://github.com/golang/go/...。
如果area内存调配应用失当,对于须要频繁内存调配的利用,能够晋升多达15%的CPU性能。
应用形式为编译Go程序时,增加 GOEXPERIMENT=arenas
参数。代码里如果有import arena
,也须要增加这个编译参数。
此外,垃圾回收器的一些外部数据结构的设计做了优化,在工夫和空间上更高效,能够节俭内存开销,晋升2%左右的CPU总体性能。
Go 1.20还新增了一个runtime/coverage
包,调用这个包的API能够把程序运行的代码覆盖率数据输入到指定文件。
Compiler
Go 1.20新增了PGO(profile-guided optimization)个性,能够帮忙开发者做程序性能优化。
目前,编译器反对pprof CPU profile,这种类型的profile能够通过例如runtime/pprof
或net/http/pprof
收集失去。
如果要开启PGO,在应用go build
编译程序的时候,要减少-pgo
参数。-pgo
指定的是profile文件的门路。如果-pgo=auto
,那go命令会在main这个包的门路上来找名为default.pgo
的文件。-pgo=off
能够敞开优化。详情能够参考:PGO Proposal。
如果应用了PGO,编译器会对被调用比拟多的函数,更多地应用inline function的形式去做性能优化。
性能测试表明,如果开启了profile-guided inlining optimization,能够晋升3%-4%的性能,前期Go会退出更多的PGO优化反对。
留神,因为PGO并不是稳固版本,生产环境应用须要小心。
此外,从Go 1.20开始,编译器禁止匿名interface嵌套,如下代码会编译失败。
type I interface { m() interface { I }}
Linker
在Linux环境,链接器会在进行link操作的时候,为glibc
或者musl
抉择动静解释器。
在Windows环境,链接器当初反对基于LLVM的C语言工具链。
Go 1.20版本开始,应用go:
和type:
作为前缀,用于编译器生成的符号,而摈弃应用go.
和type.
作为前缀。
这能够防止歧义,因为有的go package的命名是以go.
开始的。
Bootstrap(自举)
如果要编译Go语言自身的源代码,必须要设置GOROOT_BOOTSTRAP
环境变量。
在 1.4 版本开始,Go语言实现了自举,即能够通过1.4版本来编译装置之后版本的编译器。
假如GOROOT_BOOTSTRAP
环境变量没有设置,那Go 1.17版本及之前的版本,会尝试在 $HOME/go1.4
(%HOMEDRIVE%%HOMEPATH%\go1.4
on Windows)寻找Go 1.4或者更新的bootstrap工具链。
Go 1.18和Go 1.19首先会找 $HOME/go1.17
或 $HOME/sdk/go1.17
,找不到的话,就回退去找 $HOME/go1.4
。
Go 1.20要实现自举,须要依赖Go 1.17的最新子版本,即Go 1.17.13版本。
Go 1.20会先找 $HOME/go1.17.13
或 $HOME/sdk/go1.17.13
,如果找不到,就回退找$HOME/go1.4
。
在接下来,Go官网会把自举的工具链每年向前推进一步。预期是Go 1.22会要求依赖Go 1.20的最新子版本用于Go 1.22的自举。
总结
下一篇会介绍Go 1.20在外围库方面的优化工作,有一些内容值得学习,欢送大家放弃关注。
举荐浏览
- Go 1.20要来了,看看都有哪些变动-第1篇
- Go 1.20要来了,看看都有哪些变动-第2篇
- Go面试题系列,看看你会几题
- Go常见谬误和最佳实际系列
开源地址
文章和示例代码开源在GitHub: Go语言高级、中级和高级教程。
公众号:coding进阶。关注公众号能够获取最新Go面试题和技术栈。
集体网站:Jincheng's Blog。
知乎:无忌。
福利
我为大家整顿了一份后端开发学习材料礼包,蕴含编程语言入门到进阶常识(Go、C++、Python)、后端开发技术栈、面试题等。
关注公众号「coding进阶」,发送音讯 backend 支付材料礼包,这份材料会不定期更新,退出我感觉有价值的材料。还能够发送音讯「进群」,和同行一起交流学习,答疑解惑。
References
- https://tip.golang.org/doc/go...