为什么我从 MacPort 使用 XCode 的 llvm 与 clang++ 获得更快的二进制文件?
Why do I get a faster binary with XCode's llvm vs. clang++ from MacPorts?
我已经编写了一个基准测试方法来测试我的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实现。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 如何告诉 clang 将调试符号放入可执行二进制文件中
- 如何使用预编译的二进制文件安装CLang
- 带有调试符号的Clang二进制文件太大
- 有没有一种方法可以在输出二进制文件中存储clang编译时标志
- 为什么我从 MacPort 使用 XCode 的 llvm 与 clang++ 获得更快的二进制文件?