from: http://geek.youkuaiyun.com/news/detail/126456
原文:zapcc - a faster C++ compiler
作者:Baptiste Wicht 翻译:赖信涛 责编:仲培艺
我刚刚加入了一个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以上的内存,有点奇怪。
作为一个程序来说,它很给力,希望能继续加油,为编译器的优化带来更多动力。
官方网站:zapcc