【发布时间】:2021-11-27 14:50:17
【问题描述】:
我在linux上遇到了一个g++9.3.0 -O2的奇怪bug
下面的代码是从我的 SJT 算法代码转换而来的。
如果我将最后一行init 保留在generate 中,则时间成本为1200+ms。
如果我删除它,时间成本是600+ms。
这个错误出现在带有 g++9.3.0 的 ubuntu20.04 上。我用g++9.3.0在win10和macOS上测试过,没有出现bug。我也在linux上用g++8和g++10测试过,也没有出现bug。
这里是代码。原问题是69468547。
我想知道是什么导致了这种奇怪的“时间成本翻倍”行为?
20211008:我用另一种方式重现了这个错误。这里是whole code。我在generate中执行了两次strange_func(SJT算法),第一个的时间成本是653ms,第二个是1322ms。您可以在 linux 上使用 gcc9.3.0 重现该错误。我也试过gcc10,没有bug。
#include <cstdio>
#include <cstring>
#include <chrono>
using namespace std::chrono;
#define MAXN 100
struct Permutation {
int N;
char s[2*MAXN];
int r[MAXN];
inline void init() {
memset(s, 0, sizeof(s));
memset(r, 0, sizeof(r));
}
void generate(int n) {
N = n;
init();
auto start = steady_clock::now();
strange_func();
auto end = steady_clock::now();
auto duration = duration_cast<milliseconds>(end - start);
printf("time cost(ms): %ld\n", duration.count());
init();
}
void strange_func() {
int k = N, t = -1;
while (true) {
r[N] += 1;
if (r[N] < N) {
char c = s[k]; s[k] = s[k+t]; s[k+t] = c;
k += t;
} else {
int i = N;
while (r[i] == i)
r[i] = 0, r[--i] += 1;
if (i == 0) break;
t = 0;
}
}
}
} perm;
int main() {
int n;
scanf("%d", &n);
perm.generate(n);
return 0;
}
【问题讨论】:
-
您的问题是什么?另外,
n的值是什么? -
对不起,我忘记了这个问题。我已经在最后一行添加了。
-
我不明白为什么这是一个与您原来的问题不同的问题(您甚至在这个问题中链接了)
-
除打印持续时间外,您的程序没有副作用。而且
init的情况下,内存的内容最后还是知道的。 -
你可以尝试不优化编译它吗?选项是
-O0。
标签: c++ ubuntu gcc optimization time