Go 1.7 会提升编译速度并且会产生更快的代码

  • Sergio De Simone
  • 张卫滨

2016 年 4 月 24 日

话题:语言 & 开发

Go 1.7 的开发周期即将接近下一个里程牌版本,不过 Go 的提交者 Dave Cheney报告了在即将发布的释放版本中,团队在提升语言工具链方面所做的努力。

Cheney 指出,基于当前的开发状态,Go 1.7 将会很轻易地成为史上最棒的 Go 释放版本。在工具链提升方面的努力主要聚焦在两个领域:

  • 编译和连接时间;
  • 代码生成。

在编译时间方面,自从由 C 转向 Go以来,Go 编译器就饱受较差的性能所困扰。这个问题已经有了很多的讨论,在面向 Go 1.7 的版本中,最近的工作已经完成,它致力于减少编译器所使用的内存量并且在连接时间方面也有所提升。相对于 Go 1.5.3,这能够将总的编译时间降低大约 20-30%,如下图所示:

我们可以看到,Go 1.4.3 编译器的性能依然要明显优于当前的 1.7 版本。不过,当前的性能提升也不应该被低估,尤其是新的 Go 编译器包含了一个全新的代码生成后端,在性能方面,它还没有完全成熟。

还需要提及的是自举(bootstrap)Go 编译器的决策其实与性能无关,而是使用 Go 来取代 C 会在开发方面所带来的优势,这包括易于编写正确的代码、调试、更好的工具以及对并行的支持等等。实际上,Go 编译器的代码是从 C 代码库自动转换得到的,而不是完全重写的。

如前文所述,代码生成是 Go 1.7 另一个主要关注的领域。新的后端改成了使用静态单一分配形式(static single assignment,SSA),这与LLVM 和其他编译器相同,这样能够对生成的代码启用多项优化。其中包含无用代码消除(dead code elimination)、寄存器分配(register allocation)、栈帧分配(stack frame allocation)等。如 Cheney所述,在当前的初步开发版本中,Go 1.7 新的 SSA 后端所产生的代码在速度上能够最高提升 20%。另外,相对于 Go 1.6,它所产生的二进制会更小,在很多方面,这个版本能够与 Go 1.4 版本相媲美

查看英文原文Go 1.7 to Improve Compilation Speed and Generate Faster Code

语言 & 开发