乐趣区

关于go:Go-120要来了看看都有哪些变化第3篇

前言

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/pprofnet/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…
退出移动版