使用-O3
进行优化时,此代码几乎没有时间void foo()
{
int *A = (int *)malloc(1024*1024*sizeof(int));
int *B = (int *)malloc(1024*1024*sizeof(int));
double total_time = 0;
for(int i=0;i<1024;i++)
for(int j=0;j<1024;j++)
A[i*1024+j] = rand()%1000;
for(int t=0;t<10;t++)
{
double t1 = get_clock();
for(int i=0;i<1024;i++)
for(int j=0;j<1024;j++)
B[j*1024+i] = A[i*1024+j];
double t2 = get_clock();
total_time += (t2-t1);
}
double time_taken = total_time/10;
free(A);
printf("time taken = %7.16f\n",time_taken);
}
什么编译器优化使得此代码从-O0的0.014秒到-03
的0.000000答案 0 :(得分:3)
如果不检查生成的组件,很难肯定。一般来说,有as-if rule,其中
例如,可能是因为在任何地方都没有使用允许任何和所有代码转换不会改变程序的可观察行为
A
没有B
,编译器只是省略了
for(int i=0;i<1024;i++)
for(int j=0;j<1024;j++)
A[i*1024+j] = rand()%1000;
以及
for(int i=0;i<1024;i++)
for(int j=0;j<1024;j++)
B[j*1024+i] = A[i*1024+j];
答案 1 :(得分:3)
内部大循环没有副作用,因为你不在任何地方使用B,所以任何使用-O3的合适编译器都会消除它。
为避免这种情况,您可以尝试汇总值并在结尾处打印出结果。或者,从B打印一些随机元素可能会使编译器产生足够的怀疑,以避免消除