作为一个大学项目,我为各种排序算法写了一个基本的基准测试。我必须使用几个编译器标志,比如-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
我如何才能把它简化到关键部分呢?还是我走错了路?
以下是测试中的代码(不要因为类似冒泡排序的交换而责怪我--这是必需的):
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++就不是这样了。
发布于 2015-11-17 23:11:44
如果您没有安装命令行工具,可以使用终端命令安装它们:
xcode-select --install安装后,您可以从命令行运行clang,命令如下所示:
clang++ -std=c++14 -O3 test.cpphttps://stackoverflow.com/questions/33746674
复制相似问题