Go 1.1 的性能提升

标签: IT技术 业界资讯 Go 软件开发 | 发表时间:2013-05-21 17:06 | 作者:伯乐
出处:http://blog.jobbole.com

伯乐在线注:今天上午在微博推荐了英文原文,感谢 @Codefor 的热心翻译。如果其他朋友也有不错的原创或译文,可以尝试 推荐给我们

——————————————————————–

这是Go1.1发布后性能提升分析系列的第一篇文章。

Go官方文档( 这里这里)报告说,用Go1.1重新编译你的代码就可以获得30%-40%的性能提升。对linux/amd64平台而言,有大量的评测可以证明上述性能提升,对linux/386和linux/arm类平台,结果甚至更让人惊讶。但是我暂时持保留意见。

关于gccgo,本系列重点关注提升Go1.1性能的gc系列编译器(5g,6g和8g)。由于和gc编译器共享相同的运行时和标准库,gccgo间接受益于这些改进,但不作为本次基准测试系列的重点。

Go1.1在编译器,运行时和标准库上有许多直接导致程序速度提升的特色改进,尤其是:

  • 代码生成优化。涵盖3个gc编译器,包括更好的寄存器分配,减少不必要的间接加载,减少代码量
  • 内联优化。包括部分内置函数调用的内联,处理接口转换时编译器生成的存根方法的内联。
  • 减少栈使用。进而减轻栈大小的压力,更少分裂栈。
  • 引入并行垃圾收集器。收集器仍然是标记-删除,但是垃圾收集期间可以使用所有的CPU。
  • 更精细的垃圾收集。减少堆的大小,进而获得更低的GC延时
  • 新的运行时调度器。在调度goroutine时做出更好的决策。
  • 调度器和net包整合的更紧密。大幅减少包处理的延时并获得更高的吞吐。
  • 部分运行时和标准库用汇编重写。利用特定的移动或密码指令的优势。

 

autobench介绍

没有事实依据的不可复现的评测比任何事情都让我不满。由于这个系列要列出大量的数字,给出一些强有力的结论,对我而言,有必要提供一个渠道,大家可以在自己机器上验证我的结果。

为此,我已经建立了一个简单的基于make的工具,用于比较Go1.0和Go1.1在一系列综合基准测试中的性能。它可以运行在任何Go支持的任何平台上。虽然该项目仍处于开发阶段,它已经产生了很多有用的数据。这些数据存放在代码库中。你可以在 GitHub找到这个项目:

https://github.com/davecheney/autobench

我要感谢那些从自己机器提交基准测试结果数据的Go社区的成员,这使得我对Go1.1的相对性能做出明智的结论。

如果你对参与autobench感兴趣,很快将有一个记录Go1.1性能的分支产生。

 

一图胜千言万语

为了更好的展示基准测试结果, AJ Starks 已经开发了一个好用的工具。benchviz 可以将misc/benchcmp枯燥的基于文本的输出转换成漂亮的图表。你可以在AJ的博客上看到所有关于benchviz 的信息。

http://mindchunk.blogspot.com.au/2013/05/visualizing-go-benchmarks-with-benchviz.html

在传统的misc/benchcmp工具之后,对所有的改进,当运行时间的减少,或者吞吐的增加,以条状图的形式向右扩展,反之,向左收缩。

 

Go1 在linux/amd64平台基准测试

这篇文章的剩余部分将会集中在linux/amd64的性能评测。6g编译器被认为是gc编译器包中的旗舰编译器。除了在前后端的代码生成优化,标准库和运行时的性能敏感部分已经用汇编重写以充分利用SSE2指令。 这篇文章接下来的数据来自此结果文件 linux-amd64-d5666bad617d-vs-e570c2daeaca.txt

Go1基准测试包是一个综合的基准测试,它试图获取真实世界中标准库中的主要包的使用情况。总体上,这个结果支持之前30%-40%性能提升的结论。通过查看提交到autobench库中的结果,很明显GobDecode和Gzip性能有所退步,并且问题 51655166 都产生了。相对而言,后者的罪魁祸首应该至少部分归于迁移到64位int 。

 

net/http 基准测试

这一系列的基准测试是从net/http包中抽出来的,它展示了Brad Fitzpatrick 和Dmitry Vyukov以及许多其他人贡献到net和net/http包中的工作。

这个系列的基准测试中需要指出的是,ReadRequest(用于解包一个HTTP请求)的性能提升。ClientServerParallel基准测试目前并不能在所有的amd64平台运行,因为部分amd64平台还不支持新的和net聚合的运行时。完成剩余的BSD和Windows平台的支持是1.2周期的重点。

 

Runtime 微基准测试

在这里展示的最后一个基准测试是从runtime包中抽取的。

Runtime基准测试展示了runtime包非常低层次部分的微型基准测试。

上面明显的衰退就是第一个Append基准测试。然而在实际时间中,基准测试却从36ns/op提升到100ns/op,这意味着,对于某些append使用场景是存在性能衰退的。这可能已经在建议 CL 9360043中指出。

Runtime基准测试中最大的赢家就是惊人的map。新的map代码由khr在 issue 3886声明并贡献。包括Channel操作的开销减少(感谢Dmitry的新调度器),涉及complex128操作的优化,以及用64位汇编重写的hash和内存移动操作的提速。

 

结论

对于运行现代64位intelCPU的linux/amd64平台,6g编译器和运行时可以生成显著高校的代码。其他的amd64平台也有类似的提升,具体的提升程度会有变化。如果你有能力,我鼓励你审阅autobench代码库中的基准测试数据,并提交你自己的结果数据。

在接下来的文章中,我会着重在Go1.1给386和arm平台带来的性能提升。

 

英文原文: Dave Cheney,编译: @Codefor

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

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

相关文章

Go 1.1 的性能提升,首发于 博客 - 伯乐在线

相关 [go 性能 提升] 推荐:

Go 1.1 的性能提升

- - 博客 - 伯乐在线
伯乐在线注:今天上午在微博推荐了英文原文,感谢 @Codefor 的热心翻译. 如果其他朋友也有不错的原创或译文,可以尝试 推荐给我们. 这是Go1.1发布后性能提升分析系列的第一篇文章. Go官方文档( 这里和 这里)报告说,用Go1.1重新编译你的代码就可以获得30%-40%的性能提升.

Go 和 Python Web 服务器性能对比

- Ken - python.cn(jobs, news)
我通常使用 Python 来构建 Web 应用. 一年前,在兴趣的驱使下,我开始学习 Go. 在此期间,我重写了一些原本由 C 开发的 CGI 应用,包括运行于 chroot 环境下的同 thttpd 服务器一起的应用. 我开始寻找可以开发易于 chroot、且内置 Web 服务器的独立 Web 应用的工具.

超全的Go Http路由框架性能比较

- - 鸟窝
使用Go开发Web应用非常方便,它自己的路由器 default request multiplexer超级简单,但是功能也有限,所幸net/http库的设计非常好,很容易实现自己定义的路由器,所以你如果在github搜一下,会找到很多的第三方的路由库. 但是这些路由库良莠不齐,尤其是早期实现的路由器,有些实现了很差的路由算法,有些没有仔细考虑内存的分配,导致垃圾回收的问题.

[译]Go性能分析工具工具和手段

- - 鸟窝
翻译自 Basics of benchmarking, profiling and tracing with Go,作者对Go性能分析的工具和手段做了一个很好的总结. 这篇文档提供了Go提供的测量性能和收集运行时信息的工具的概览. 它不是一个关于基准测试、性能分析和跟踪的详细教程. 所以这篇文档也可以看成是一篇备忘录.

Go和HTTPS

- - Tony Bai
近期在构思一个产品,考虑到安全性的原因,可能需要使用到 HTTPS协议以及双向数字证书校验. 之前只是粗浅接触过HTTP( 使用Golang开 发微信系列). 对HTTPS的了解则始于那次 自行搭建ngrok服务,在那个过程中照猫画虎地为服务端生成了一些私钥和证书,虽然结果是好 的:ngrok服务成功搭建起来了,但对HTTPS、数字证书等的基本原理并未求甚解.

提升Java的锁性能

- - Java译站
几个月前我们介绍了如何通过 Plumbr来 进行线程锁检测,随后便收到了很多类似的问题,“Hi,文章写得不错,现在我终于知道是什么引发的性能问题了,但是现在我该怎么做. 为了在我们的产品中集成这个解决方案,我们付出了许多努力,不过在本文中,我想给大家分享几个常用的优化技巧,而不一定非要使用我们这款锁检测的工具.

Valve宣布CS: GO

- 小D - Solidot
此前媒体曾报告说Valv邀请CSS玩家和社区代表访问其总部,现在谜团已经解开:Valv宣布了团队射击游戏Counter-Strike: Global Offensive,它将在2012年初登陆Steam(PC和Mac)、PS3和Xbox360. CS: GO将是12年前发布的CS的真正扩展,而不是类似CS:Source的引擎更新,它提供了新的地图、角色、武器,经典CS地图(如de_dust),新的游戏模式,配对比赛和排名榜等.

Go 语言初步

- wei - 云风的 BLOG
所谓认真玩,就是拿 Go 写点程序,前后大约两千行吧. 据说 Go 的最佳开发平台是 Mac OS ,我没有. Windows 版还没全部搞定,但是也可以用了. 如果你用 google 搜索,很容易去到一个叫 go-windows 的开源项目上. 如果你用这个,很多库都没有,而且语法也是老的. 我在 Windows 下甚至不能正确链接自己写的多个 package.

提升 web 应用程序的性能

- pathfinder - IBM developerWorks 中国 : 文档库
作为 web 用户,我们知道页面加载或刷新的速度对其成功至关重要. 本文将帮助您更好地理解影响 web 应用程序性能的因素. 学习识别这些问题并且找到客户端内容的瓶颈. 探索 JavaScript、DOM、CSS 和 Dojo 小部件的性能问题. 将通过一个例子展示使用 YSlow 和 Firebug 适当调整 Dojo 小部件.

TCmalloc对squid的性能的提升

- caoxg - 开心平淡对待每一天。热爱生活
           TCmalloc对squid的性能的提升一、简介:. 1、安装tcmalloc所需要的libunwind库 [32位系统不用安装]. *注意:据说加上’–with-large-files’ 选项时编译会出错. 4、配置好squid并启动squid.. squid+tcmalloc: 20 型号:Dell R410 硬盘:2*SAS/146G/15K 内存:16G CPU:16.