Go语言回顾:从Go 1.0到Go 1.13( 二 )


关于sync.Pool的更多信息 , 可以参考文章《Understand the Design of Sync.Pool》 。
Go开发组在该版本中对channel进行了优化改善 , 使其性能获得提升 。下面是channel在Go 1.2和Go 1.3版本中的基准测试数据对比:

Go语言回顾:从Go 1.0到Go 1.13

文章插图
 
Go 1.4 – 2014.12在该版本中 , Go提供了对Android的官方支持 。使用golang.org/x/mobile包 , gopher们可以使用Go编写简单的Android应用 。
同时 , 之前版本中大量用C语言和汇编语言实现的运行时已经被翻译为Go , 一个更为精确的垃圾回收器让堆内存分配减少了10~30% 。
和版本自身无关的是 , Go工程在本次发布后已经从Mercurial迁移到Git , 从Google code迁移到github 。
Go还发布了go generate命令 , 该命令可以通过扫码代码中的//go:generate指示器来生成代码 , 可以帮助Gopher简化代码生成工作 。
更多关于这方面的信息可以参考Go blog和这篇文章《Generating code》 。
Go 1.5 – 2015.8这个新版本推迟了两个月发布 , 目的是适应Go新的开发发布周期:每年二月和八月进行发布:
Go语言回顾:从Go 1.0到Go 1.13

文章插图
 
图来自:https://github.com/golang/go/wiki/Go-Release-Cycle
在该版本中 , 垃圾回收器被全面重构 。由于引入并发回收器 , 回收阶段带来的延迟大幅减少 。下面是来自一个生产环境服务器上的延迟数据 , 我们看到延迟从300ms降到了30ms:
Go语言回顾:从Go 1.0到Go 1.13

文章插图
 
图片来自 https://blog.golang.org/ismmkeynote
这个版本还发布go tool trace命令 , 通过该命令我们可以实现执行器的跟踪(trace) 。这些跟踪是在test执行、运行时生成的 , 跟踪信息可以通过浏览器呈现:
Go语言回顾:从Go 1.0到Go 1.13

文章插图
 
图片来自原始Go Execution Tracer文档
Go 1.6 – 2016.2这个版本的最显著变化是当使用HTTPS时 , 将默认支持HTTP/2 。
垃圾回收器的延迟在该版本中进一步降低:
Go语言回顾:从Go 1.0到Go 1.13

文章插图
 
图片来自https://blog.golang.org/ismmkeynote
Go 1.7 – 2016.8这个版本发布了context包 。该包用于处理timeout和取消任务 。
更多关于context包的信息 , 可参考文章:《Context and Cancellation by Propagation》 。
编译器工具链的性能得到了较大幅度优化 , 编译速度更快 , 二进制文件size更小 , 有些时候幅度可达20~30% 。
Go 1.8 – 2017.2垃圾回收器的延迟在该版本中进一步改善 , 延迟时间已经全面降到毫秒级别以下:
Go语言回顾:从Go 1.0到Go 1.13

文章插图
 
图片来自https://blog.golang.org/ismmkeynote
对延迟的优化还将继续 。接下来版本的目标是将延迟降到100微秒左右 。
这个版本还大幅提升了defer的性能:
Go语言回顾:从Go 1.0到Go 1.13

文章插图
 
图片来自 https://medium.com/@blanchon.vincent/go-how-does-defer-statement-work-1a9492689b6e
更多关于defer的信息 , 可以参考文章How Does Defer statement Work? 。
Go 1.9 – 2017.8该版本引入了alias语法 。
type byte = uint8这里byte是unit8的一个alias 。
sync包增加了Map类型 , 该类型支持并发访问(原生map类型不支持) 。
关于map的更多信息 , 参考文章“Concurrency Access with Maps” 。
Go 1.10 – 2018.2在该版本中 , test包引入了一个新的缓存机制 , 所有通过测试的结果都将被缓存下来 。当test没有变化时 , 重复执行test会节省大量运行test的时间 。
first run:ok /go/src/retro 0.027ssecond run:ok /go/src/retro (cached)go build命令也维护了一个已构建的包的缓存以加速构建性能 。
该版本中垃圾回收器并没有显著性能提升 。但是Go team为垃圾回收定义了一个新的SLO(Service-Level Objective):
Go语言回顾:从Go 1.0到Go 1.13

文章插图
 
图片来自https://blog.golang.org/ismmkeynote
Go 1.11 – 2018.8Go 1.11引入了一个重要的新功能:Go modules 。Go module的引入是为了应对过去几年官方调查问卷结果中Go社区反馈的几个主要挑战:


推荐阅读