我目前正在使用GCC,但我最近发现了Clang,我正在考虑切换。但是有一个决定因素——它生成的二进制文件的质量(速度、内存占用、可靠性)——如果gcc - o3可以生成运行速度快1%的二进制文件,或者Clang二进制文件占用更多内存,或者由于编译器错误而失败,这是一个交易破坏者。
Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真正感兴趣的是最终编译软件的基准测试/比较——您能给我指出一些已有的资源或您自己的基准测试吗?
我目前正在使用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来获得更快的二进制文件。