算术运算的不成比例处理时间[C]

use*_*519 6 c performance gcc

有人可以用这个小程序解释这里发生了什么吗?

#include<stdio.h>

int main()
{
    float a=0.577;
    float b=0.921; 
    float c; 
    int i;

    for (i=0;i<100000000;i+=1){
        c=0.7*a-0.2*b;
        //a=0.145*c+2.7*b;
    }

    printf ("%.3f\n",c);
}
Run Code Online (Sandbox Code Playgroud)

注意,有一行注释掉了.

我首先编译它没有线,然后是线.(使用gcc -O2 ...).并测量了处理时间.我很惊讶地发现执行时间0.001s与之相反2.444s.这没有多大意义.或者更确切地说,这背后必定有一些逻辑.

您能否解释一下发生了什么以及如何缓解这个问题?

我处理一个处理大量数据的程序,在我看来,我遇到了相同的性能问题.

我正在考虑从浮点数转换为整数但似乎整数表示它的行为相同.

编辑:最后解决方案是微不足道和合乎逻辑的.所以我感谢所有答案和解释!

jma*_*man 13

在第一种情况下,计算值是恒定的.编译器将c = 0.7 * 0.577 - 0.2 * 0.921编译时计算.它甚至免费为虚无之内它改变(优化圈外a,bc是不变的).

在第二个实例,ac改变用于每次迭代所以必须计算100000000倍.

  • @Jim:不,第二行不是常数.在循环的每次迭代中,c取决于a,然后a取决于c.没有什么是不变的. (2认同)