我目前正在使用GCC,但我最近发现了Clang,我正在考虑切换。但是有一个决定因素——它生成的二进制文件的质量(速度、内存占用、可靠性)——如果gcc - o3可以生成运行速度快1%的二进制文件,或者Clang二进制文件占用更多内存,或者由于编译器错误而失败,这是一个交易破坏者。

Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真正感兴趣的是最终编译软件的基准测试/比较——您能给我指出一些已有的资源或您自己的基准测试吗?


当前回答

我注意到GCC 5.2.1和Clang 3.6.2的一个特殊区别是 如果你有一个关键循环,比如:

for (;;) {
    if (!visited) {
        ....
    }
    node++;
    if (!*node)
        break;
}

当使用-O3或-O2编译时,GCC会推测 展开这个循环八次。叮当根本无法展开它。通过 我发现,在我的程序数据的特定情况下, 正确的展开量是5,所以GCC溢出和Clang 下颚突出的。然而,超调对性能更不利,因此GCC在这里的性能要差得多。

我不知道这种差异是普遍趋势还是 只是一些特定于我的场景的东西。

不久前,我写了几个垃圾收集器,以便更多地学习c语言的性能优化。我得到的结果足以让我稍微偏爱Clang。尤其是因为垃圾 收集主要是关于指针跟踪和复制内存。

结果是(以秒为单位的数字):

+---------------------+-----+-----+
|Type                 |GCC  |Clang|
+---------------------+-----+-----+
|Copying GC           |22.46|22.55|
|Copying GC, optimized|22.01|20.22|
|Mark & Sweep         | 8.72| 8.38|
|Ref Counting/Cycles  |15.14|14.49|
|Ref Counting/Plain   | 9.94| 9.32|
+---------------------+-----+-----+

这都是纯C代码,我对这两个编译器都没有任何要求 编译c++代码时的性能。

Ubuntu 15.10 (Wily Werewolf), x86.64, AMD Phenom II X6 1090T处理器。

其他回答

唯一能确定的方法就是试一试。FWIW,与常规的GCC 4.2相比,我已经看到了使用Apple的LLVM GCC 4.2的一些非常好的改进(适用于具有相当多SSE的x86-64代码),但YMMV适用于不同的代码库。

假设您正在使用x86/x86-64,并且您确实关心最后的百分之几,那么您也应该尝试Intel的ICC,因为它通常可以击败GCC—您可以从intel.com获得30天的评估许可并尝试它。

Clang编译代码更快的事实可能没有生成二进制代码的速度重要。不过,这里有一系列基准测试。

基本上来说,答案是:视情况而定。 有很多针对不同类型应用程序的基准测试。

我的应用程序的基准是:GCC > ICC > Clang。

很少有I/O,但有很多CPU浮动和数据结构操作。

编译标志是-Wall -g -DNDEBUG -O3。

https://github.com/zhangyafeikimi/ml-pack/blob/master/gbdt/profile/benchmark

GCC 4.8和Clang 3.3在生成的二进制文件的速度方面有很小的整体差异。在大多数情况下,两个编译器生成的代码执行相似。这两个编译器都不能支配另一个编译器。

GCC和Clang之间存在显著性能差距的基准测试是巧合。

程序性能受编译器选择的影响。如果一个开发人员或一组开发人员只使用GCC,那么使用GCC可以预期程序比使用Clang运行得稍微快一些,反之亦然。

从开发人员的角度来看,GCC 4.8+和Clang 3.3之间的一个显著区别是GCC有-Og命令行选项。该选项支持不干扰调试的优化,因此,例如,总是可以获得准确的堆栈跟踪。Clang中缺少这个选项使得Clang难以作为一些开发人员的优化编译器使用。

Phoronix对此做了一些基准测试,但它是关于几个月前Clang/LLVM的快照版本。结果是,事情或多或少是一种推动;GCC和Clang在所有情况下都不是更好的。

因为你使用的是最新的Clang,所以它可能不太相关。显然,GCC 4.6将对Core 2和Core i7进行一些重大优化。

我认为Clang更快的编译速度对原始开发人员更有利,然后当您将代码推向世界时,Linux发行版、BSD等最终用户将使用GCC来获得更快的二进制文件。