我目前正在使用GCC,但我最近发现了Clang,我正在考虑切换。但是有一个决定因素——它产生的二进制文件的质量(速度、内存占用、可靠性)——如果__abc0可以产生运行速度快1%的二进制文件,或者Clang二进制文件占用更多内存,或者由于编译器错误而失败,这是一个交易破坏者。
Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真正感兴趣的是最终编译软件的基准测试/比较——您能给我指出一些已有的资源或您自己的基准测试吗?
唯一能确定的方法就是试一试。FWIW,我已经看到了一些非常好的改进使用苹果的LLVM GCC 4.2相比常规的GCC 4.2 (x86-64代码有相当多的SSE),但YMMV不同的代码库。
假设你正在使用x86/x86-64,并且你真的关心最后的百分之几,那么你应该尝试英特尔的国际刑事法庭,因为它通常可以击败GCC -你可以从intel.com获得30天的评估许可并尝试它。
Phoronix做了一些基准测试关于这个,但它是关于几个月前Clang/LLVM的快照版本。结果是,事情或多或少是一种推动;GCC和Clang在所有情况下都不是更好的。
因为你使用的是最新的Clang,所以它可能不太相关。然后,GCC 4.6显然为酷睿2和酷睿i7指定了一些主要的优化。
我认为Clang更快的编译速度对原始开发人员来说更好,然后当你把代码推向世界时,Linux发行版,BSD等最终用户将使用GCC来获得更快的二进制文件。
Clang编译代码更快的事实可能没有生成二进制代码的速度重要。然而,这里有一个一系列基准测试。
更新:GCC 4.8.1 v clang 3.3比较附加在下面。
更新:GCC 4.8.2 v clang 3.4比较附加到此。
我维护一个OSS工具,它是为GCC和Clang Linux构建的, 以及微软的Windows编译器。这个工具可恩是一个预处理器 和C/ c++源文件和代码线的分析器:its 计算概要文件主要研究递归下降解析和文件处理。 开发分支(这些结果属于该分支) 目前约有90个档案,约有11K LOC。它是编码的, 现在,在c++中,这是丰富的多态性和模板,但仍然是 由于其不太久远的过去在C。 没有明确地利用Move语义。它是单线程的。我 没有认真的努力去优化它,而“架构”;
我的Linux测试工具目前coan开发过程大致 70K源文件混合在一个文件解析器测试用例中,强调 测试消耗1000个文件,场景测试消耗<1 k文件。< / p >
除了报告测试结果外,还会累积和 显示coan中所消耗的文件总数和运行时间(它只是将每个coan命令行传递给Linux time命令,并捕获并相加报告的数字)。任何测试所花费的可测量时间为0的测试加起来都是0,这一事实美化了计时,但这样的测试的贡献可以忽略不计。定时统计信息显示在make check的末尾,如下所示:
time
make check
coan_test_timer: info: coan processed 70844 input_files. coan_test_timer: info: run time in coan: 16.4 secs. coan_test_timer: info: Average processing time per input file: 0.000231 secs.
| -O2 | -O3 |O2/O3| ----------|-----|-----|-----| GCC-4.7.2 | 231 | 237 |0.97 | ----------|-----|-----|-----| Clang-3.2 | 234 | 186 |1.25 | ----------|-----|-----|------ GCC/Clang |0.99 | 1.27|
std::shared_ptr<X>
std::unique_ptr
std::auto_ptr
std::unique_ptr<X>
| -O2 | -O3 |O2/O3| ----------|-----|-----|-----| GCC-4.7.2 | 234 | 234 |1.00 | ----------|-----|-----|-----| Clang-3.2 | 188 | 187 |1.00 | ----------|-----|-----|------ GCC/Clang |1.24 |1.25 |
这里需要注意的是:
一个我没有能力评论的明显问题是为什么 Clang应该能够在我的应用程序中找到25%的-O2加速 频繁使用的智能指针类型从唯一的变为共享的, 而GCC对相同的变化漠不关心。我也不知道该不该 对Clang的-O2优化港口的发现欢呼或嘘声
更新:GCC 4.8.1 v clang 3.3
现在相应的结果是:
| -O2 | -O3 |O2/O3| ----------|-----|-----|-----| GCC-4.8.1 | 442 | 443 |1.00 | ----------|-----|-----|-----| Clang-3.3 | 374 | 370 |1.01 | ----------|-----|-----|------ GCC/Clang |1.18 |1.20 |
所有四个可执行文件现在的平均处理时间比以前要长得多 1文件不反映最新编译器的性能。这是由于 事实上,测试应用程序的后期开发分支已经承担了大量的工作 与此同时,解析的复杂性并以速度为代价。只有比率 重要。< / p >
现在的要点并不新奇:
更新:GCC 4.8.2 v clang 3.4
下面是我们现在熟悉的最新两个编译器版本rev.301的计时矩阵:
coan - rev.301结果
| -O2 | -O3 |O2/O3| ----------|-----|-----|-----| GCC-4.8.2 | 428 | 428 |1.00 | ----------|-----|-----|-----| Clang-3.4 | 390 | 365 |1.07 | ----------|-----|-----|------ GCC/Clang | 1.1 | 1.17|
-O2
-O3
这是619版的矩阵。
coan - rev.619 results
| -O2 | -O3 |O2/O3| ----------|-----|-----|-----| GCC-4.8.2 | 210 | 208 |1.01 | ----------|-----|-----|-----| Clang-3.4 | 252 | 250 |1.01 | ----------|-----|-----|------ GCC/Clang |0.83 | 0.83|
把301数字和619数字放在一起比较,有几点是显而易见的。
GCC超过了Clang以前的优势。在每个优化点
你更好的二进制是最快的二进制,还是最好的二进制 补偿廉价的代码?或最好地补偿昂贵 精心设计的代码优先考虑可维护性和重用而不是速度?这取决于 你产生二进制的动机的性质和相对权重,以及 你这样做的约束。
无论如何,如果你非常关心打造“最好的”;然后是二进制 最好继续检查编译器的连续迭代是如何交付您的 “最好”的理念;
GCC 4.8和Clang 3.3在生成的二进制文件的速度方面有很小的整体差异。在大多数情况下,两个编译器生成的代码执行相似。这两个编译器都不能支配另一个编译器。
GCC和Clang之间存在显著性能差距的基准测试是巧合。
程序性能受编译器选择的影响。如果一个开发人员或一组开发人员只使用GCC,那么使用GCC可以预期程序比使用Clang运行得稍微快一些,反之亦然。
从开发人员的角度来看,GCC 4.8+和Clang 3.3之间的显著区别是GCC有-Og命令行选项。该选项支持不干扰调试的优化,因此,例如,总是可以获得准确的堆栈跟踪。Clang中缺少这个选项使得Clang难以作为一些开发人员的优化编译器使用。
-Og
我对我的应用程序的基准是:GCC >国际刑事法庭祝辞叮当声。
很少有I/O,但有很多CPU浮动和数据结构操作。
编译标志是-Wall -g -DNDEBUG -O3。
https://github.com/zhangyafeikimi/ml-pack/blob/master/gbdt/profile/benchmark
for (;;) { if (!visited) { .... } node++; if (!*node) break; }
那么GCC在使用-O3或-O2编译时会推测 展开这个循环八次。叮当根本无法展开它。通过 我发现,在我的程序数据的特定情况下, 正确的展开量是5,所以GCC溢出和Clang 下颚突出的。然而,超调对性能更不利,因此GCC在这里的表现要差得多
我有不知道如果展开的差异是一个总体趋势或 只是一些特定于我的场景。
结果是(以秒为单位的数字):
+---------------------+-----+-----+ |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| +---------------------+-----+-----+
在Ubuntu 15.10 (Wily Werewolf)上,x86.64,和一个AMD 杰出人才 II X6 1090T处理器上。