ホームページ  >  記事  >  バックエンド開発  >  Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

Golang菜鸟
Golang菜鸟転載
2023-08-04 16:59:261063ブラウズ

最近、Go1.20 が 2 月初旬に正式リリースされました。非常に早くリリースされました。以前は月末まで延期されました。いくつかの記事を読んだところ、機能的なトレードオフにより、いくつかの新機能 (アリーナなど) を手放すことを余儀なくされました。

Go チームは 2 月に何かすることがあるのだろうか、それとも休暇をとる予定なのでしょうか?それとも、一時解雇が仕事の引き継ぎに影響を与えるのではないかと心配ですか?

今日は、私たちにとってより関連性の高い新機能を簡単に確認し、1.20 にアップグレードできるかどうかを確認します。

コンパイル速度の向上

Go1.18 がジェネリックを正式にリリースするまでは、喜びと不安がありました。これはジェネリックスをサポートしていますが、Go1.18 のコンパイル速度は Go1.17 よりも遅く、約 15 ~ 18% 遅くなり、大幅に遅くなります。

Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

汎用機能により、Go が誇るビルド速度が低下しました。後から建てたらコーヒーが作れるのではないかと心配ですか?

当初は Go1.19 で修正されると言われていましたが、その後修正されました。最終的に、現在のバージョンは修正されました。

次のテスト レポート:

                │ 117.results │            118.results            │            119.results            │            tip.results            │
                │   sec/op    │   sec/op    vs base               │   sec/op    vs base               │   sec/op    vs base               │
GoBuildKubelet     52.58 ± 0%   56.54 ± 1%  +7.54% (p=0.000 n=10)   55.47 ± 1%  +5.50% (p=0.000 n=10)   51.41 ± 1%  -2.22% (p=0.000 n=10)
GoBuildIstioctl    47.78 ± 1%   51.44 ± 0%  +7.65% (p=0.000 n=10)   50.89 ± 5%  +6.50% (p=0.000 n=10)   46.05 ± 1%  -3.62% (p=0.000 n=10)
GoBuildFrontend    19.03 ± 1%   20.55 ± 1%  +7.99% (p=0.000 n=10)   20.04 ± 0%  +5.33% (p=0.000 n=10)   18.22 ± 1%  -4.27% (p=0.000 n=10)
geomean            36.29        39.10       +7.72%                  38.39       +5.77%                  35.07       -3.37%

最新の Go1.20 ベン​​チマーク テストでは、現在のバージョンと Go1.17 のビルド速度は一貫しています。

さらに、コンパイラーとガベージ コレクターが最適化され、メモリのオーバーヘッドが削減され、全体的な CPU パフォーマンスが 2% 向上しました。

Go1.21 は、MacOS と Windows の一部のバージョンのサポートを終了します

Go1.20 のアップデートの発表では、macOS と Windows を含むメジャー アップデートの終了通知も発表されました。オペレーティング·システム。

Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

それらは次のとおりです:

  • Go1.20 は、macOS 10.13 High Sierra での実行をサポートする最後のバージョンです。または 10.14 Mojave バージョン。 Go 1.21 には macOS 10.15 Catalina 以降が必要です。

  • Go1.20 は、Windows 7、8、Server 2008、および Server 2012 の任意のバージョンでの実行をサポートする最後のバージョンです。 Go 1.21 には、少なくとも Windows 10 または Server 2016 が必要です。

#皆さん、オペレーティング システムのバージョンを更新する必要があるようです。そうしないと、Go は次のバージョンでのコード作成を歓迎してくれません。

Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

有需要的同学在下个版本前尽早做好升级。

Go 发行版瘦身

新版本起,Go 的 $GOROOT/pkg 目录将不再存储标准库的预编译包存档,Go 发行版的将迎来一轮瘦身。

大小对比如下。

Go1.20:

Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

Go1.19:

Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

约比老版本缩减了 1/3,还是比较明显的。

PGO 引入

在 Go1.20 起,Go 引入了 Profile-guided optimization (PGO),翻译过来是使用配置文件引导的优化,当前为预览版本。

PGO 是一门编译器优化技术,能够在不改业务代码的情况下,给你的应用程序带来一定的性能提升。在 Go PGO 中将会依托 runtime/pprof 所生成的 profile 来完成。

Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

结果上可以使得 Go tool(工具链)能根据运行时信息执行特定于应用程序和工作负载的优化。说明了就是想提高性能,不需要改业务代码。

具体可以详见:《PGO 是啥,咋就让 Go 更快更猛了?》

支持封装多个错误

在原有 Go1.13 的 errors API 上进行新增和修改,核心是支持一个错误可以封装多个错误的特性。

新特性例子:

func main() {
 err1 := errors.New("err1")
 err2 := errors.New("err2")
 err := errors.Join(err1, err2)
 fmt.Println(err)
 if errors.Is(err, err1) {
  fmt.Println("err is err1")
 }
 if errors.Is(err, err2) {
  fmt.Println("err is err2")
 }
}

输出结果:

err1
err2
err is err1
err is err2

具体可以详见:《Go1.20 继续小修小补 errors 库。。。》

新增 StringData, String, SliceData

Go 团队通过分析、搜索发现 reflect.SliceHeader 和 reflect.StringHeader:

type StringHeader struct {
   Data uintptr
   Len  int
}

在业内经常被滥用,使用不方便,很容易出现隐性问题。例如:Data 字段类型是 uintptr 不是 unsafe.Pointer。设什么都可以,灵活度过于高,非常容易搞出问题。

在 Go1.20 起,在 unsafe 标准库新增了 3 个函数来替代前面这两个类型的使用。希望能够进一步标准化,并提供额外的类型安全。

Go1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?

如下函数签名:

  • func String(ptr *byte, len IntegerType) string:根据数据指针和字符长度构造一个新的 string。
  • func StringData(str string) *byte:返回指向该 string 的字节数组的数据指针。
  • func SliceData(slice []ArbitraryType) *ArbitraryType:返回该 slice 的数据指针。

新版本的用法变成:

func StringToBytes(s string) []byte {
    return unsafe.Slice(unsafe.StringData(s), len(s))
}

func BytesToString(b []byte) string {
    return unsafe.String(&b[0], len(b))
}

以往常用的 reflect.SliceHeaderreflect.StringHeader 将会被标注为被废弃。

具体可以详见:《别乱用了,用新的。Go SliceHeader 和 StringHeader 将会被废弃!》

优化时间比较和格式记忆

2006-01-02 15:04:05

有很多 Go 同学反馈老要记 2006-01-02 15:04:05,发现这个日期时间点,使用的次数非常高频:

##511940time.RFC1123

使用频率的数据有理有据。

Go1.20 加了以下常量,便于直接引用:

DateTime   = "2006-01-02 15:04:05"
DateOnly   = "2006-01-02"
TimeOnly   = "15:04:05"

Time.Compare

再者就是新增了时间比较的方法。

在现在的标准库中,有 3 个方法来比较 time.Time 对象,分别是:Before()、Equal() 和 After(),作用上类似 f7bd953807dcb270799fd7a85cf4a46b。但缺少 31558558eb655bc1739b4281d8939162= 的等价物。

Go1.20 将会支持 Time.Compare,以此来达到类似的效果。作用是将 Time 对象 t 和 u 两者进行比较。

func (t Time) Compare(u Time) int

该方法返回如下几种结果:

  • 如果 t 在 u 之前,则返回 -1。
  • 如果 t 在 u 之后,则返回 +1。
  • 如果它们相同,则返回 0。

具体可以详见:《Go1.20 中两个关于 Time 的更新,终于不用背 2006-01-02 15:04:05 了!》

禁用匿名接口循环导入

以前可以做匿名接口循环导入的骚操作。如下代码:

type I interface {
 m()
 interface {
     I
  }
}

这段代码,声明了接口类型 I,然后又包含了 m(),又包含接口 I。这会是一个 “永动机”,永远都不会停止。在开源的 GitHub 中,也真实存在着。

Go1.20 起,编译器将会默认拒绝匿名接口循环导入。如果没有用户反馈受到了重大的影响或问题,将会计划在 Go1.22 中正式的禁用和移除该项功能的支持。

具体可以详见:《Go1.20 将禁止匿名接口循环导入!》

没有 C工具链默认禁用 CGO

Go1.20 将会在没有 C 工具链的系统上默认禁用 CGO。这理论上是一个不兼容性设置,如果大家有需要,可以提前设置好 CGO_ENABLED 环境变量,以避免导致部分应用程序出问题。

支持切片到数组的转换

Go1.20 起支持将切片转换成数组。

如下代码:

func main() {
 v := []string{"煎", "鱼", "进", "脑", "子", "了"}
 s := [6]string(v)
 fmt.Println(s)
}

当然,前提是切片和数字的长度和类型都要对的上。否则会出现如下报错:

panic: runtime error: cannot convert slice with length 5 to array or pointer to array with length 6

goroutine 1 [running]:
main.main()
 /tmp/sandbox1162344488/prog.go:9 +0x1d

Program exited.

总结

在本次 Go1.20 的更新中,比较有意思的是 PGO 的预览版本,大家有机会可以体验下不改代码就提高应用性能的快感。而相关的更新有的是在偿还技术债务。例如:编译加速等。

もともと注目を集めていたアリーナは、以前「顔を平手打ちせよ、兄弟よ、Go1.20 アリーナが登場!」でも紹介されました。でシェアさせていただきました。具体的な実装と分析の後、Go チームは既存の API に重大な問題があることを発見し、反復コードを一時的にロールバックしたため、断念しました。これについては後ほど別途シェアする予定です。

Go1.21 以降、macOS および Windows の一部のバージョンはサポートされなくなることに注意することが特に重要です。場合によっては、一部の企業のマシンや自分のマシンでも、事前にアップグレードする必要があるかもしれません

ランキング 頻度 形式
1 75616 time.RFC3339
2 23954 time.RFC3339Nano
3 13312 "2006-01-02 15:04:05"
4 12332 "2006-01-02"

以上がGo1.20: PGO、コンパイル速度、エラー処理、その他の新機能について何を知っていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGolang菜鸟で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。