C中的死编码
Dead coding in C
我使用不同的编译器选项分析以下代码 (O0 O1 O2 O3 Os)。第一个迭代在 "warming the cache" 的循环之外。对于 O0 和 O1,随着输入参数(N 和 ITER)越大,射出时间不同,0.00 越高。
当我使用 O2、O3 和 Os 选项时,问题就来了。射出时间为 0.000。我已阅读,可能是死代码检测。可能吗?为什么会这样?
for(i=0; i<N; i++){
a = i * 128;
b = a / 32;
}
gettimeofday(&inicio, NULL);
for(j=0; j<ITER; j++)
for(i=0; i<N; i++){
a = i * 128;
b = a / 32;
}
gettimeofday(&final, NULL);
tiempo = (final.tv_sec-inicio.tv_sec + (final.tv_usec-inicio.tv_usec)/1.e6);
fprintf(fp,"%lf\n",tiempo);
printf("%lf\t",tiempo);
for(i=0; i<N; i++){
a = i << 7;
b = a >> 5;
}
gettimeofday(&inicio, NULL);
for(j=0; j<ITER; j++)
for(i=0; i<N; i++){
a = i << 7;
b = a >> 5;
}
有人能帮帮我吗?
谢谢
由于计算中涉及的变量不会在循环外访问,因此编译器完全删除代码我不会感到惊讶。
两种简单的检查方法:
- 将
a
和 b
声明为 volatile
。
- 从不同的优化级别看一下生成的程序集。
我使用不同的编译器选项分析以下代码 (O0 O1 O2 O3 Os)。第一个迭代在 "warming the cache" 的循环之外。对于 O0 和 O1,随着输入参数(N 和 ITER)越大,射出时间不同,0.00 越高。
当我使用 O2、O3 和 Os 选项时,问题就来了。射出时间为 0.000。我已阅读,可能是死代码检测。可能吗?为什么会这样?
for(i=0; i<N; i++){
a = i * 128;
b = a / 32;
}
gettimeofday(&inicio, NULL);
for(j=0; j<ITER; j++)
for(i=0; i<N; i++){
a = i * 128;
b = a / 32;
}
gettimeofday(&final, NULL);
tiempo = (final.tv_sec-inicio.tv_sec + (final.tv_usec-inicio.tv_usec)/1.e6);
fprintf(fp,"%lf\n",tiempo);
printf("%lf\t",tiempo);
for(i=0; i<N; i++){
a = i << 7;
b = a >> 5;
}
gettimeofday(&inicio, NULL);
for(j=0; j<ITER; j++)
for(i=0; i<N; i++){
a = i << 7;
b = a >> 5;
}
有人能帮帮我吗? 谢谢
由于计算中涉及的变量不会在循环外访问,因此编译器完全删除代码我不会感到惊讶。
两种简单的检查方法:
- 将
a
和b
声明为volatile
。 - 从不同的优化级别看一下生成的程序集。