Zapcc:一个更快的C++编译器

更新时间:2016-11-30 13:52:48 点击次数:2225次

刚刚加入了一个Zapcc的beta项目,它基于Clang,致力于做到比其他C++编译器更快。为了做到这一点,采取的方法是将一些编译器的结构缓存在服务器上,可以大幅度提高编译速度。目前的beta版本是免费的,但等发布就绪之后,将会是一个商业编译器。

每一个C++程序员都知道,当项目变得庞大之后,编译时间将会成为一个很大的问题,尤其是一些template-heavy的代码。

为了评测这款新的编译器,我将用我自己的Expression Template Library (ETL)。这是一个带有很多templates的header-only的库,里面包含很多需要编译的test case。我将拿他来和Clang=3.7和gcc-4.9.3作比较。

测试环境中,我让zapcc使用2Go RAM,每次测试之前关闭服务器一次。

Debug build

让我们先从debug build开始。在这个build中,优化被关闭,一些库的feature(GPU,BLAS等)被禁用。这是编译ETL的快方式。测试环境是四核八线程英特尔处理器,SSD硬盘。

下面这个表格显示了在不同的线程数量下,Zapcc和其他编译器的表现。

图片描述

结果非常明显:Zapcc几乎是Clang速度的三倍,GCC速度的两倍。很了不起!

这里,要提醒那些以为Clang总是会比GCC快的人,记住在这样template-heavy的代码的情况下并非如此。在我的测试中,Clang几乎总是比GCC慢,吃更多的内存。

还有一点,在我的这台电脑上,可以看出物理核心的增加导致的编译速度增加并不是很明显,所以基准很重要。

Release Build

现在,让我们来比较一下release build的编译速度。这种情况下开启了所有的ETL选项,所以耗时也自然会更多一些。

结果如下表:

图片描述

这次我们发现,差距小了很多。Zapcc比Clang快1.2-1.4倍,比GCC快1.1-1.3倍。这证明了Zapcc大部分的速度提升都是前端方面的。虽然并不是很多,但是对于很多时间长的build来说也很有意义,特别是在拥有的线程数量不多的时候。

从上表中也可以看出,Clang几乎和GCC速度相当,我们也可以推测出,优化方面Clang速度更快,前端和后端GCC更快。

因为缓存,Zapcc的内存消耗比Clang更高,而且在汇编时,服务器依然是运行的。

至于运行时,我并没有看到Clang版本和Zapcc版本有更多不同。根据官方的标准和文档,Zapcc是基于Clang的,所以它们运行时性能不会有很大差别。

Incremental build

理论上讲,Zapcc在Incremental build方面应该会有很大的性能提升,但是这这里不关闭服务器的情况下,并没有看到很大的性能提升。也许我的配置有误吧。

结论

在上面的测评中,我们可以看到在我的template-heavy库中Zapcc总是比GCC和Clang快。而且在debug build中,它的性能提升非常突出,几乎是GCC速度的两倍,Clang速度的3倍。到现在为止,我并没有看见这个工具出现任何问题,它完全可以替代Clang。

不过不能给Zapcc分配2G以上的内存,有点奇怪。

作为一个程序来说,它很给力,希望能继续加油,为编译器的优化带来更多动力。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!