内容提要
本文比较了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语言性能提升主要归功于编译器的改进、运行时优化、垃圾回收器和标准库的优化。