为什么我从 MacPort 使用 XCode 的 llvm 与 clang++ 获得更快的二进制文件?

Why do I get a faster binary with XCode's llvm vs. clang++ from MacPorts?

本文关键字:二进制文件 clang++ llvm MacPort 使用 为什么 XCode      更新时间:2023-10-16

我已经编写了一个基准测试方法来测试我的C++程序(它搜索游戏树),我注意到使用XCode 4.0.2中的"LLVM编译器2.0"选项进行编译比使用MacPorts的最新版本clang++进行编译要快得多。

如果我理解正确的话,我在这两种情况下都使用clang前端和llvm后端。苹果是否改进了clang/llvm的发行版,为Mac操作系统生成了更快的二进制文件?我找不到关于这个项目的太多信息。

以下是我的程序为各种编译器生成的基准测试,所有这些都使用-O3优化(越高越好):

(Xcode) "gcc 4.2": 38.7
(Xcode) "llvm gcc 4.2": 51.2
(Xcode) "llvm compiler 2.0": 50.6
g++-mp-4.6: 43.4
clang++: 40.6

此外,我如何使用XCode在终端使用的clang/lilvm进行编译?我找不到命令。

编辑:我输出的分数是"每秒数千场比赛",这些分数是在足够长的程序运行时间内计算出来的。多次跑步的分数非常一致,例如,最近的主要算法改进让我的速度提高了1%-5%。40%到50%的速度对我的程序来说是巨大的。

更新:我没有用-flto从命令行调用clang++。现在,当我从命令行将clang++-O3-flto与/Developer/usr/bin/crang++-O3-flto进行比较时,结果更接近,但苹果的速度仍然快6.5%。

现在如何为gcc启用链接时间优化?当我尝试g++-flto时,我得到以下错误:

cc1plus: error: LTO support has not been enabled in this configuration

Apple LLVM编译器应在/Developer/usr/bin/clang下提供。

我想不出有什么特别的原因可以解释为什么MacPorts clang++会生成较慢的代码。。。我会检查您是否传入了类似的命令行选项。有一件事会产生很大的不同,那就是如果你用一个编译器生成32位代码,用另一个编译器生产64位代码。

如果GCC没有LTO,那么您需要自己构建它:

http://solarianprogrammer.com/2012/07/21/compiling-gcc-4-7-1-mac-osx-lion/

对于LTO,您需要在说明中添加"libelf"。

http://sourceforge.net/apps/trac/mingw-w64/wiki/LTO%20and%20GCC

算法的精确速度可能取决于各种完全超出您和编译器能力的事情。您可能有一个循环,其中执行时间精确地取决于指令在内存中的对齐方式,这是编译器无法预测的。我看到过这样的情况,循环可能会进入不同的"状态",每次迭代的执行时间不同(因此,在上下文切换后,它可能会进入一个需要12或13个周期的状态,相当随机)。这一切都可能是巧合。

你可能使用不同的库,这很可能是原因。例如,在MacOSX中,他们使用了一种新的、可能更快的std::string和std::vector实现。