【发布时间】:2019-11-20 07:59:00
【问题描述】:
我正在为学校做作业。本质上,我们正在分析排序算法及其对大量数字的成本。我们有最好的情况(已经按顺序)、最坏的情况(倒序)和平均情况(随机顺序)。但是,对于我的几乎所有排序算法,排序最坏情况所需的时间都少于平均情况。阅读后,似乎是分支预测导致了这种情况。它正在识别模式(递减顺序)并比理论上更快地执行代码(大 O 表示法)。
我对分支预测进行了一些研究,虽然似乎有办法对其进行优化以使其更快,但我找不到任何完全禁用它的方法。有我可以使用的 G++ 标志吗?还是终端命令?
这是我的冒泡排序算法的一个例子:
void bubble(vector<long> &vector) {
for (int i = 0; i < vector.size() - 1; i++){
for (int j = 0; j < vector.size() - i - 1; j++) {
if (vector[j] > vector[j + 1]) {
long tmp = vector[j];
vector[j] = vector[j+1];
vector[j+1] = tmp;
}
}
}
}
我的平均情况下的时间几乎是最坏情况下的两倍。
【问题讨论】:
-
"我的平均情况下的时间几乎是最坏情况下的两倍。" 这有什么问题?或者说,有什么问题? Big-O 表示法不保证真实世界的性能;它只描述了算法的复杂性。
-
@NicolBolas:这与“最差”的含义相反。你说得对,“最坏情况的复杂性”和“最坏情况的运行时间”不必对齐。
-
__builtin_expect可能适合你:stackoverflow.com/questions/30130930/… -
倒序并不是所有算法的最坏情况。对于冒泡排序可能
-
无论如何,你的学校作业涉及复杂性还是现实世界的表现?前者不受分支预测的影响(您无法通过查看执行时间来分析复杂性),而后者对于学校项目来说可能太复杂了。
标签: c++ performance optimization cpu-architecture branch-prediction