Go语言从1.0到1.22版本的性能

Go语言从1.0到1.22版本的性能

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

本文比较了Go语言从1.0到1.22版本的性能,发现1.3、1.5、1.7和1.12版本有最大的改进。文章还提到了1.2版本中的异常情况及其原因。使用PGO可以略微提高性能,但二进制文件大小基本保持稳定。总体而言,Go语言的性能在过去几年中有了显著提升。

🔎

延伸解读

性能提升的关键版本

文章指出,Go 1.3、1.5、1.7 和 1.12 是性能改进最大的版本。这些版本可能引入了重要的编译器优化、运行时改进或垃圾回收调整。之后版本的性能提升变得非常渐进,表明容易实现的优化已经基本完成。

1.2 版本的异常与修复

在 Go 1.2 中,countwords 任务的耗时从 1.1 的 7.5 秒猛增至 25.5 秒,但在 1.3 中又降至 2.8 秒。作者通过性能分析发现,这几乎肯定是由于栈的“热分裂”问题,该问题在 1.3 中通过将 goroutine 栈从分段模型改为连续模型而得到修复。

PGO 的收益与代价

从 Go 1.20 开始引入的 PGO(Profile-Guided Optimization)能带来小幅性能提升:在 Go 1.22 下,countwords 提升约 2%,sumloop 提升约 7%。启用 PGO 后,二进制文件大小仅增加约 5%,因此作者认为通常值得使用。

长期性能改进

总体来看,与 Go 1.0 相比,countwords 任务的速度提高了约 8 倍,sumloop 任务提高了 24 倍。这些改进来自编译器、运行时、垃圾回收器和标准库的持续优化,体现了 Go 团队多年来的努力。

❓

Q&A

Go语言的性能在不同版本之间有什么变化?

Go语言从1.0到1.22版本的性能显著提升,特别是在1.3、1.5、1.7和1.12版本中有最大的改进。

Go 1.2版本的性能异常是由什么原因造成的?

Go 1.2版本的性能异常是由于栈的“热分裂”问题,导致运行时间大幅增加。

使用PGO对Go语言性能的影响如何?

使用PGO可以略微提高性能,countwords任务提高约2%,sumloop任务提高约7%。

Go语言在countwords和sumloop任务中的性能提升有多大?

countwords任务的速度提高了8倍,sumloop任务的速度提高了24倍。

Go语言的二进制文件大小在不同版本中有变化吗?

Go语言的二进制文件大小基本保持稳定,除了1.2版本有较大增加,PGO启用后仅增加约5%。

Go语言性能提升的主要原因是什么?

Go语言性能提升主要归功于编译器的改进、运行时优化、垃圾回收器和标准库的优化。

🏷️

标签

➡️

继续阅读