我目前正在使用GCC,但我最近发现了Clang,我正在考虑切换。但是有一个决定因素——它生成的二进制文件的质量(速度、内存占用、可靠性)——如果gcc - o3可以生成运行速度快1%的二进制文件,或者Clang二进制文件占用更多内存,或者由于编译器错误而失败,这是一个交易破坏者。
Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真正感兴趣的是最终编译软件的基准测试/比较——您能给我指出一些已有的资源或您自己的基准测试吗?
我目前正在使用GCC,但我最近发现了Clang,我正在考虑切换。但是有一个决定因素——它生成的二进制文件的质量(速度、内存占用、可靠性)——如果gcc - o3可以生成运行速度快1%的二进制文件,或者Clang二进制文件占用更多内存,或者由于编译器错误而失败,这是一个交易破坏者。
Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真正感兴趣的是最终编译软件的基准测试/比较——您能给我指出一些已有的资源或您自己的基准测试吗?
当前回答
GCC 4.8和Clang 3.3在生成的二进制文件的速度方面有很小的整体差异。在大多数情况下,两个编译器生成的代码执行相似。这两个编译器都不能支配另一个编译器。
GCC和Clang之间存在显著性能差距的基准测试是巧合。
程序性能受编译器选择的影响。如果一个开发人员或一组开发人员只使用GCC,那么使用GCC可以预期程序比使用Clang运行得稍微快一些,反之亦然。
从开发人员的角度来看,GCC 4.8+和Clang 3.3之间的一个显著区别是GCC有-Og命令行选项。该选项支持不干扰调试的优化,因此,例如,总是可以获得准确的堆栈跟踪。Clang中缺少这个选项使得Clang难以作为一些开发人员的优化编译器使用。
其他回答
唯一能确定的方法就是试一试。FWIW,与常规的GCC 4.2相比,我已经看到了使用Apple的LLVM GCC 4.2的一些非常好的改进(适用于具有相当多SSE的x86-64代码),但YMMV适用于不同的代码库。
假设您正在使用x86/x86-64,并且您确实关心最后的百分之几,那么您也应该尝试Intel的ICC,因为它通常可以击败GCC—您可以从intel.com获得30天的评估许可并尝试它。
GCC 4.8和Clang 3.3在生成的二进制文件的速度方面有很小的整体差异。在大多数情况下,两个编译器生成的代码执行相似。这两个编译器都不能支配另一个编译器。
GCC和Clang之间存在显著性能差距的基准测试是巧合。
程序性能受编译器选择的影响。如果一个开发人员或一组开发人员只使用GCC,那么使用GCC可以预期程序比使用Clang运行得稍微快一些,反之亦然。
从开发人员的角度来看,GCC 4.8+和Clang 3.3之间的一个显著区别是GCC有-Og命令行选项。该选项支持不干扰调试的优化,因此,例如,总是可以获得准确的堆栈跟踪。Clang中缺少这个选项使得Clang难以作为一些开发人员的优化编译器使用。
基本上来说,答案是:视情况而定。 有很多针对不同类型应用程序的基准测试。
我的应用程序的基准是:GCC > ICC > Clang。
很少有I/O,但有很多CPU浮动和数据结构操作。
编译标志是-Wall -g -DNDEBUG -O3。
https://github.com/zhangyafeikimi/ml-pack/blob/master/gbdt/profile/benchmark
Phoronix对此做了一些基准测试,但它是关于几个月前Clang/LLVM的快照版本。结果是,事情或多或少是一种推动;GCC和Clang在所有情况下都不是更好的。
因为你使用的是最新的Clang,所以它可能不太相关。显然,GCC 4.6将对Core 2和Core i7进行一些重大优化。
我认为Clang更快的编译速度对原始开发人员更有利,然后当您将代码推向世界时,Linux发行版、BSD等最终用户将使用GCC来获得更快的二进制文件。
Clang编译代码更快的事实可能没有生成二进制代码的速度重要。不过,这里有一系列基准测试。