Go1.1性能提升——第三篇

这是探讨最近发布的Go1.1性能提升系列文章中的最后一篇。你可以阅读第一篇第二篇了解amd64和386的分析内容。 这篇文章重点关注arm平台的性能。

Go1.1是一次重要的发布,因为这次发布将arm平台提升到和amd64和386平台并列的高度并且开始支持更多的操作系统。

Go1.1给arm平台带来的一些亮点包括:

  • 支持cgo
  • 额外的尝试支持freebsd/arm和netbsd/arm
  • 更好代码生成(目前引入了一个半成品的窥孔优化器),更好的寄存器分配器,以及许多小的减少代码量的改进
  • 支持ARMv6主机,包括Raspberry Pi
  • GOARM环境变量可选,GOARM的值会基于编译的主机自动确定
  • 内存分配器性能大幅提升。消除了许多之前代价高昂的模拟64位指令
  • 显著提升的软件层除法/模运算

这些改进离不开Shenghou Ma, Rémy Oudompheng和Daniel Morsing的努力,他们在Go1.1的开发周期中对编译器和运行时作出了巨大贡献。

再一次,非常感谢 Anthony Starks,他帮助我给这篇文章准备了基准测试数据和图片。

 

Go1 在linux/arm平台的基准测试

由于Go这次发布开始支持不止一种arm架构,在这里展示的是基于很多主机的基准测试数据给出的Go1.1在arm平台上的代表性的性能分析。从左上到右下依次为:

和以前一样,这里展示的结果数据可以在autobench代码库中获取。点击缩略图可以看大图。

嘿,图片在我在iSteve上无法显示!额,iOS设备对网页内加载的图片大小有限制,我们的图片超过了这个限制。但是,如果你点击加载失败的图片,在单独的新页面图片是完整的。对此不变,我很抱歉

(原图尺寸2500×2500像素,请单击查看大图)

BinaryTree17基准测试的性能提升以及提升幅度没那么大的Fannkuch11基准测试的性能提升,受堆分配器性能的影响。部分堆分配过程会更新存储在64位数中的统计数据,这些统计数据体现在runtime.MemStats中。

在Go1.1的开发周期中,在部分原子符号上的快速工作去除了许多这样的64位操作,这也导致runtime基准测试的性能下降。

 

net/http基准测试

所有的样例中,net/http基准测试都获益于新的轮询实现和对纯Go语言实现的net/http包的改进。这些工作归功于Brad Fitzpatrick和Jeff Allen。

(原图尺寸2500×2500像素,请单击查看大图)

 

runtime基准测试

runtime基准测试的结果和amd64/386平台类似。总体的趋势是性能提升,尤其是在某些例子中,有大幅提升,如map操作。

(原图尺寸2500×5000像素,请单击查看大图)

Append基准测试集中的性能提升受益于Rob Pike提交的改进,这个改进避免在向[]byte添加少量数据时调用runtime.memmove。

在所有样例中都存在的问题是一些channel操作的性能衰退。这可能是由于在arm平台上进行原子操作的代价过于高昂。目前,所有的原子操作都是有runtime包来实现。但将来有可能由对应的编译器直接操作以减少开销。
CompareString 基准测试比其他平台的结果稍差是因为CL 8056043还没有移植到arm平台上。

 

结论

添加了对cgo的支持,net包的吞吐优化,代码生成和垃圾收集器的优化,Go1.1对在arm平台上写Go程序展示了一个里程碑式的改进。

一句话总结这个系列的文章,显然Go1.1践行了在所有三个支持的平台上整体30-40%的性能提升的承诺。仅从编译器层面考虑,虽然6g仍然是旗舰编译器并且得益于底层最快的硬件,8g和5g相对于去年Go1.0的发布也显示出大幅性能提升。

 

等等,还有

如果你觉得这个系列的文章还不错,并且想关注Go1.2的进度,我将很快建一个新的autobench分支来追踪Go1.1和tip(Go1.2)。准备好之后我会发布博客和tweet。

由于Go1.2开发窗口已在5月14日打开。Dmitry Vyukov已经提交了内存分配器和垃圾收集器的改进,原子符号的目标是进一步减少GC的开销。Carl Shapiro也已经开始了精确栈分配空间的收集的工作。

Go1.2的提案还包括一个更好的内存分配器,改进调度器使其可以抢占长时间运行的goroutine(目的是减少GC延迟)

最后,Go1.2已经有了发布时间表。虽然我们不能准确的说那些功能会在或者不会在Go1.2,但是我们能够确定Go1.2应该在2013年年底完成。

 

 

英文原文:Dave Cheney,感谢@Codefor 的热心翻译。如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线

译文链接:http://blog.jobbole.com/40448/

【非特殊说明,转载必须在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部