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

jopen 6年前
   <p style="text-align: center;"><img alt="" src="https://simg.open-open.com/show/732219ddf5c69f69cc04d66b7f3e9b90.png" /></p>    <p>Go 1.7的开发周期即将接近<a href="/misc/goto?guid=4958990099753768009">下一个里程牌版本</a>,不过Go的提交者Dave Cheney<a href="/misc/goto?guid=4958990099881548717">报告</a>了在即将发布的释放版本中,团队在提升语言工具链方面所做的努力。</p>    <p>Cheney指出,基于当前的开发状态,Go 1.7将会很轻易地成为史上最棒的Go释放版本。在工具链提升方面的努力主要聚焦在两个领域:</p>    <ul>     <li>编译和连接时间;</li>     <li>代码生成。</li>    </ul>    <p>在编译时间方面,<a href="/misc/goto?guid=4958861656295487938">自从由C转向Go</a>以来,Go编译器就饱受较差的性能所困扰。这个问题已经有了很多的<a href="/misc/goto?guid=4958990100044276819">讨论</a>,在面向Go 1.7的版本中,最近的工作已经完成,它致力于减少编译器所使用的内存量并且在连接时间方面也有所提升。相对于Go 1.5.3,这能够将总的编译时间降低大约20-30%,如下图所示:</p>    <p><img src="https://simg.open-open.com/show/6c293d2e67b16384c7b2394aa270830c.jpg" alt="Go 1.7会提升编译速度并且会产生更快的代码" width="681" height="268" /></p>    <p>我们可以看到,Go 1.4.3编译器的性能依然要明显优于当前的1.7版本。不过,当前的性能提升也不应该被低估,尤其是新的Go编译器包含了一个全新的代码生成后端,在<a href="/misc/goto?guid=4958990100155089149">性能</a>方面,它还没有完全成熟。</p>    <p>还需要提及的是自举(bootstrap)Go编译器的决策其实与性能无关,而是使用Go来取代C会在开发方面所带来的<a href="/misc/goto?guid=4958990100252364556">优势</a>,这包括易于编写正确的代码、调试、更好的工具以及对并行的支持等等。实际上,Go编译器的代码是从C代码库<a href="/misc/goto?guid=4958990100349360040">自动转换</a>得到的,而不是完全重写的。</p>    <p>如前文所述,代码生成是Go 1.7另一个主要关注的领域。新的后端改成了使用<a href="/misc/goto?guid=4958990100454981385">静态单一分配形式(static single assignment,SSA)</a>,这与<a href="/misc/goto?guid=4958990100549245453">LLVM和其他编译器相同</a>,这样能够<a href="/misc/goto?guid=4958990100647432521">对生成的代码启用多项优化</a>。其中包含无用代码消除(dead code elimination)、寄存器分配(register allocation)、栈帧分配(stack frame allocation)等。如Cheney<a href="/misc/goto?guid=4958990100647432521">所述</a>,在当前的初步开发版本中,Go 1.7新的SSA后端所产生的代码在速度上能够最高提升20%。另外,相对于Go 1.6,它所产生的二进制会更小,在很多方面,<a href="/misc/goto?guid=4958990100758769455">这个版本能够与Go 1.4版本相媲美</a>。</p>    <p>来自:<a href="http://www.infoq.com/cn/news/2016/04/go-17-toolchain-improvements?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=news">InfoQ</a></p>