Nat*_*idt -1 c optimization gcc
我正在使用GCC 4.8.1.我试图通过将其放入嵌套循环来对某些代码的速度进行基准测试,如下例所示.每当我这样做时,它会在最短的时间内(如.02秒)执行,使用-03或不进行任何优化,无论有多少次迭代.有什么理由吗?我确信它工作正常,因为值总是正确的,如果我printf在循环中使用,那么它会按预期运行.
int main()
{
int i,j,k;
int var;
int big_num = 1000000;
int x[1];
for (i = 0;i<big_num;++i){
for (j = 0;j<big_num;++j){
for (k = 0;k<big_num;++k){
// any short code fragment such as:
var = i - j + k;
x[0] = var;
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于您编辑的问题,情况并非如此:您的代码声明了一个单元素数组,int x[1];并且使用一个越界索引访问它(索引应该小于1但非负数,因此只能为0)x[1]; 这是典型的未定义行为,编译器可以通过发出任何类型的代码来合法地优化它.
BTW,GCC 4.9(在我的Debian/SID/X86-64)是(理所当然)优化代码到一个空的main(因为没有有用的计算发生); 你可以通过编译gcc -fverbose-asm -O2 -S和查看生成的*.s汇编文件来检查这个; 如果您对优化过程中的各种内部表示非常好奇,请编译-fdump-tree-all; 您也可以改变编译器的行为(或添加一些检查过程),例如通过使用MELT扩展它
你可以让你的计算有意义的更换x[0] = var;与x[0] += var;和结束你main与副作用x[0],如printf("%d\n", x[0]);或return x[0] != 0;.然后编译器可能会生成一个循环(它可能在编译时计算循环的结果,但我不认为GCC足够聪明).
最后,典型的当前微处理器通常是无序和超标量的,因此每个周期执行多于一个指令(具有例如至少2GHz的时钟频率).因此,它们每秒运行数十亿次基本操作.您通常需要基准测试持续超过半秒(否则测量值不够有意义)并重复几次基准测试.因此,您需要编写基准测试代码,其中执行数十亿(即超过10 10)个基本C操作.并且您需要该代码有用(副作用或在其他地方使用的结果计算),否则编译器将通过删除它来优化.此外,基准测试代码应该采取一些输入(否则编译器可能会在编译时进行大量计算).在你的情况,你可能会初始化bignum喜欢
int main (int argc, char**argv) {
int big_num = (argc>1)?atoi(argv[1]):1000000;
Run Code Online (Sandbox Code Playgroud)