这是探索Go 1.1 正式版性能三部曲中的第二部分
在第一部分中我是在AMD64平台下面做的测试,同时包含了在运行时和编译前优化的各项改进.
在本文中,我将重点关注Go 1.1 在 I386平台上面的性能情况。关于本次测试的结果你可以从 linux-386-d5666bad617d-vs-e570c2daeaca.txt.获取。
说到性能, 8g编译器仍处于劣势. 只有少数通用寄存器是允许386构架的程序模型的, 并且会有一些奇怪的限制使得编译器和优化器产生沉重的负担. 然而这并没有阻止Rémy Oudompheng在1.1诞生期间对8g编译器的重大贡献。
首先老的387浮点模型被废弃了(它仍然存在,如果你运行的是很旧的硬件并支持SSE2指令与theGO386=387switch)。
另外,Rémy 尽最大的努力在 6g(及 5g,ARM编译器)代码移植到 8g 过程时改进代码生成。在可能的情况下将代码转移到编译器前端,gc,包括引入一个框架来重写划分为简单的移位和乘法运算。
在一般状态下,在该主机上, linux/386 的结果显示改进是有益的,在某些情况下,比 linux/amd64 更好。与 linux/amd64 不同点在于, Gzip 与 Gob 的基准测试并没有减慢。
BinaryTree 和 Fannkuch11 则有些回归,对此的解释被假定因为垃圾回收的精细化。这涉及到对堆中分配的对象大小和类型的一些额外跟踪记账,而正是这些展现在其基准测试之中。
对 net 包的改进在先前的 linux/amd64 文中已经证明,并可以覆盖 linux/386。对 ClientServerbenchmark 的改进并没有同其表亲 amd64 一样被标记出来,但仍在运行时和 net 包之间更紧密的集成方面在整体上表现出显着的改善。
和第一篇的amd64基准测试一样,runtime微基准测试显示出了有好有坏的结果。一些低层次的操作变的稍微慢一些,同时,其他一些操作,如map,性能有显著提升。
最后这两个基准测试,截取了一部分在下面,是因为他们性能提升太多了,屏幕放不下。这个性能提升主要归功于这个变化,其为strings,bytes,runtime包引入了一个更快的低层次的Equals操作。结果不言自明。
benchmark old MB/s new MB/s speedup BenchmarkCompareStringBigUnaligned 29.08 1145.48 39.39x BenchmarkCompareStringBig 29.09 1253.48 43.09x
虽然8g不是gc系列编译器中的最好的,(Ken Thompson自己也曾说,386平台基本上没有多余可用的寄存器),linux/386很容易就实现了之前声称的30%-40%的性能提升。甚至在一些基准测试中,相比Go1.0,linux/386打败了linux/amd64
除此之外,由于内存使用的减少,现在所有的编译器在编译时只需要大概之前一半的内存,这样的直接结果就是Go1.1比Go1.0编译速度提高了30%。 我鼓励你去审查autobench代码库中的基准测试数据。如果你有能力,请提交你自己的测试结果。
在这个系列的最后一篇文章中我将关注Go1.1给arm平台带来的性能提升。我向你保证,最后一篇的将是最精彩的。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务