作为一个大学项目,我为各种排序算法编写了一个基本的基准。我必须使用几个编译器标志,如-Wall -g0 -O3
和C ++ 14标准。
在某些时候,我意识到一些时间测量没有意义,算法优化没有效果。一位同学在使用GCC的Linux机器上运行相同的代码,并按预期工作。因此,它一定是(现在仍然是)LLVM / clang ++配置问题 - 至少这是我的假设。
所以我检查了我的IDE(Xcode 7.1.1)中的构建设置,甚至编译了shell上的源代码,但问题仍然存在。
最后,我查看了Xcode的报告导航器,并在终端上使用了详细输出(-v
)。它揭示了clang ++默认使用许多其他参数:
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.11.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -disable-free -disable-llvm-verifier -main-file-name Benchmark.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 253.6 -v -dwarf-column-info -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -stdlib=libc++ -O3 -Wall -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /Users/Kruse/Downloads/ProgramOptimization -ferror-limit 19 -fmessage-length 142 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.11.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o /var/folders/q4/rj3wqzms2fdcqlxgdzb3l5hc0000gn/T/Benchmark-1912ed.o -x c++ Benchmark.cpp
如何将其剥离至关键部位?还是我走错了路?
这是测试中的代码(不要因为类似于bubort的交换而责怪我 - 这是一个要求):
class InsertionSort {
public:
template <typename T, size_t SIZE>
static void sort(std::array<T, SIZE> &field) {
for (size_t global = 1; global < SIZE; global++) {
for (size_t sorted = global; sorted > 0
&& field[sorted] < field[sorted - 1]; sorted--) {
std::swap(field[sorted], field[sorted - 1]);
}
}
}
template <typename T, size_t SIZE>
static void sortGuard(std::array<T, SIZE> &field) {
size_t minIndex = MinimumSearch::getMin(field);
std::swap(field[minIndex], field[0]);
for (size_t global = 2; global < SIZE; global++) {
for (size_t sorted = global; field[sorted] < field[sorted - 1]; sorted--) {
std::swap(field[sorted], field[sorted - 1]);
}
}
}
};
最低搜索量如下:
class MinimumSearch {
public:
template <typename T, size_t SIZE>
static size_t getMin(std::array<T, SIZE> &field, size_t startIndex = 0) {
size_t minIndex = startIndex;
T minVal = field[minIndex];
for (size_t i = minIndex; i < SIZE; i++) {
if (field[i] < minVal) {
minIndex = i;
minVal = field[i];
}
}
return minIndex;
}
};
InsertionSort#sortGuard(std::array<T, SIZE>&, size_t)
应该比默认排序方法更快。这是使用GCC的情况,但不是LLVM / clang ++。
答案 0 :(得分:0)
如果您没有安装命令行工具,可以使用terminal命令安装它们:
xcode-select --install
安装完成后,您可以从命令行运行clang
,例如:
clang++ -std=c++14 -O3 test.cpp