写点什么

Go 语言的历史回顾

2019 年 9 月 06 日

Go语言的历史回顾

Go 的发展历史对所有开发者来说都是必备知识。了解 Go 语言历年来各版本的主要变化,将有助于深入了解使用 Go 语言所需要的思维方式以及各版本的优缺点。你可以通过访问特定版本的更新日志链接查看更多详细内容。


Go 1.0 - 2012 年 3 月:

随着 Go 第一个版本发布的还有一份兼容性说明文档。该文档说明,Go 的未来版本会确保向后兼容性,不会破坏现有程序。


此版本中已经包含 go tool pprof 命令,它是Google的pprof C++分析器的一个变种;同时还包含 go vet 命令(之前的是 go tool vet),它可以报告程序包中可能存在的错误。


Go 1.1 - 2013 年 5 月:

这个版本的 Go 致力于增强语言特性(编译器、垃圾回收机制、映射、goroutine 调度器)与性能。下面是改进的图例:



图源


此版本内置了竞态检测器,这已成为 Go 语言必不可少的工具。


你可以通过这篇文章:“Race Detector with ThreadSanitizer” 了解更多关于竞态检测器的信息。


重新编写后的Go的调度器性能有了显著提高。调度器目前的设计如下:



图源


M 是操作系统线程,P 表示一个处理器(P 的数量不能超过 GOMAXPROCS),其中每个 P 对应一个本地 go 协程队列。1.1 版本之前,P 的概念没有被引入,go 协程在全局范围通过存在于全局的单个互斥锁管理。这次改进实现了“任务窃取(work-stealing)”,允许一个 P 处理队列“窃取”另外一个 P 处理队列的协程任务。



图源


有关 Go 调度器与任务窃取的更多信息,请查看Jaana B.Dogan的"Go的任务窃取调度器”文章。


Go 1.2 - 2013 年 12 月:

test 命令支持代码覆盖率报告,并提供新的 go tool cover 命令输出代码测试覆盖率的统计信息:



图源


同时可以提供代码测试覆盖信息:



Go 1.3 - 2014 年 6 月:

堆栈管理在此版本中得到了重要改善。堆栈现在会分配连续的内存片段,并提高了分配效率。这使得 Go 语言在下个版本中将堆栈大小减少到 2KB。


这同时改进了某些组件中堆栈的错误拆分所导致的性能下降问题,此类问题会在堆栈密集分配/释放状态下出现。以下 json 包的例子展示了性能对于堆栈大小的相关度:



图源:contiguous stack


引入连续堆栈的机制修复了这类组件的性能问题。下面是另一个 html/template 包的例子,它也展示出了性能对于堆栈大小的敏感度:



想了解更多信息,可阅读文章 “How Does the Goroutine Stack Size Evolve?”


这个版本同时发布了 sync 包的 Pool 组件。通过 Pool,我们可以复用代码结构,减少分配资源的数量,并且该组件随后成为 Go 生态系统中许多改进的来源,如标准库中的 encoding/json 和 net/http 包,或者 Go 社区中的 zap 等包。


想了解更多信息,可阅读文章 Understand the Design of Sync.Pool”.


Go 团队同时改进了channel的实现,提升了它的性能。以下是 Go 1.2 与 Go 1.3 的基准测试对比:



Go 1.2 与 Go 1.3 版本间 channel 的性能对比


Go 1.4 - 2014 年 12 月:

Android 的官方支持包golang.org/x/mobile随着这个版本一同发布,使得开发者可以仅用 GO 代码编写简单的 Android 应用。此外,之前用 C 和汇编语言编写的大多数运行时已转换为用 Go 语言实现。由于使用了更精准的垃圾收集器,堆栈大小减少了 10~30%。


虽然与新版本无关,Go 的项目代码管理工具从 Mercurial 切换为 Git,与此同时,项目也从 Google Code 迁移到了 Github 上。


Go 还发布了 go generate 命令,此命令会扫描//go:generate 指令提供的信息生成代码,简化了代码生成的方式。


关于代码生成的更多信息,可参考Go的官方博客这篇文章


Go 1.5 - 2015 年 8 月:

从该版本开始,Go的发布时间延迟了两个月,调整为每年 8 月和 2 月发布新版本:



图源


在此版本中,垃圾回收器被完全重新设计实现。归功于基于并发的回收器,垃圾回收延迟被显著降低。以下来自于 Twitter 生产环境服务器的例子,其中 GC 延迟从 300 毫秒降低到 30 毫秒:



图源


这个版本还发布了执行追踪记录,可通过 go tool trace 命令获取。追踪信息可在测试或运行期间生成,展示在浏览器窗口中:



原始的Go执行跟踪文件


Go 1.6 - 2016 年 2 月:

在使用 HTTPS 的情况下增加对于 HTTP/2 协议的默认支持是这次更新的最重要更改。同时,再一次降低了垃圾回收器的延迟:



图源


Go 1.7 - 2016 年 8 月:

此版本发布了context包,它可以为用户提供处理超时和任务取消的机制。


想了解更多,可阅读文章“Context and Cancellation by Propagation.”


编译工具链在这次更新中得到了优化:加速了编译过程;降低了编译后二进制文件的大小,幅度可达 20~30%。


Go 1.8 - 2017 年 2 月:

此版本包含对于垃圾回收器的改进,使得两次垃圾回收的暂停时间减小到了毫秒级:



图源


同时识别了剩余仍未解决的暂停模式,并在下一个版本中得到修复。修复后,通常情况下暂停时间能控制在 100 微秒左右。


此版本还改进了 defer 函数:



图源


Go 1.9 - 2017 年 8 月:

此版本中增加了类型别名:


type byte = uint8
复制代码


这表示 byte 是 uint8 的类型别名。


sync 包增加了保证并发访问安全性的Map类型。


Go 1.10 - 2018 年 2 月:

test 包增加了新的智能缓存机制。现在成功完成的测试结果会被缓存,这样 test 包会自动跳过未做更改的代码的相关测试用例,节省了开发人员运行测试套件的时间:


first run:ok      /go/src/retro 0.027s
second run:ok /go/src/retro (cached)
复制代码


与此同时,go build 命令会缓存最近构建过的包,从而加快了构建过程。新版本不包含垃圾回收器的实质性改动,但为它重新定义了 SLO(服务级别目标):



图源


Go 1.11 - 2018 年 8 月:

Go 1.11 版本引入了一个重要功能:Go模块。Go 模块产生是为了应对 Go 语言社区面临的一大挑战。这是通过调查问卷收集到的:



2018年Go语言调查


第二个新特性是增加了实验性的WebAssembly支持,它可以帮助开发人员将 Go 程序编译为兼容四个主要 Web 浏览器的二进制程序。


Go 1.12 - 2019 年 2 月:

此版本在analysis包的基础上重写了 go vet 命令。这个包有着更大的灵活性,允许开发人员编写自己的代码检查工具。


Go 1.13 - 2019 年 9 月:

sync 包的 Pool 组件得到了改进,使得池中的资源不会在垃圾回收的时候被清除。通过新机制里引入的缓存,两次垃圾回收之间没有被使用过的实例才会被清除。


同时重写了逃逸分析逻辑,使得 Go 程序减少了堆上的分配次数。以下是新的逃逸分析基准测试结果:



图源


原文链接:


Go: Retrospective


2019 年 9 月 06 日 11:425742

评论

发布
暂无评论
发现更多内容

架构实战营 作业1

solider

第一周作业

Damon

刚火了的中台转头就拆,一大波公司放不下又拿不起来!

小傅哥

Java 架构 中台 小傅哥 海盗奇兵

数字签名在信息安全是什么?

Machine Gun

网络安全 信息安全 WEB安全 数字签名

​程序员的二十多个防猝死指南小妙招

Java架构师迁哥

如何在 Mac 下用 Clion 调试 MySQL 源码

AI乔治

Java MySQL 架构 调优

通过调试 Nginx 源码来定位有趣 Nginx 转发合并斜杠和编码问题

AI乔治

Java nginx 架构

重磅!不容错过的阿里内部Spring Cloud Alibaba速成手册也太赞了(2021版)

程序员小毕

程序员 架构 微服务 阿里 SpringCloud

看我如何在面试官前吹牛P

yes的练级攻略

面试

微信业务架构和学生管理系统架构设计

鹿洺

架构实战营

架构实战营模块 1 作业

Lukefang

HW Y7 2018

无名

架构实战营模块1第1课-学习总结

吴建中

架构实战营

架构实战营模块一 作业

我叫大法师

遭GitHub连夜封杀下架?被泄露的阿里内部Java面试手册到底有多强?

Java架构师迁哥

# 模块1作业

灯火阑珊

抖音春晚幕后 | 支撑 12 亿红包雨的云原生基础设施

火山引擎

数据库 分布式 云原生 边缘计算

Flink程序结构与数据流

大数据技术指南

flink 4月日更

聪明人的训练(七)

Changing Lin

四月日更

架构实战营模块一作业

梦寐凯旋

2021金三银四程序员面试必问总结

Java架构师迁哥

微信业务架构图&学生管理系统

刘敏

test

大肚皮狒狒

企业与员工的三种共同体关系

石云升

28天写作 职场经验 管理经验 4月日更

二本渣渣辛酸面试之旅:5面阿里Java岗侥幸上岸,定级P6

神奇小汤圆

Java 编程 程序员 架构 面试

由 JVM Attach API 看跨进程通信中的信号和 Unix 域套接字

AI乔治

Java 架构 jdk JVM

架构实战营 | 模块一 | 作业

curtis

再聊 TCP backlog

AI乔治

Java 架构 TCP TCP/IP

最全API文档工具集合,总有一个你喜欢的!!

尧二水丶

API APi设计 文档 开发文档 四月日更

c语言思维地基搭建(c语言介绍)

-jf.

学习笔记 大学作业 四月日更

Web安全

Machine Gun

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

Go语言的历史回顾-InfoQ