谁能解释一下这个小程序是怎么回事?
#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);
}
注意,有一行被注释掉了。
我是先不加行再加行编译的。 (使用 gcc -O2 ...
)。并测量了处理时间。我很惊讶地发现执行时间是 0.001s
而不是 2.444s
。这没有多大意义。或者更确切地说,这背后一定有某种逻辑。
您能解释一下发生了什么以及如何缓解这个问题吗?
我在处理一个处理大量数据的程序,在我看来我遇到了非常相同的性能问题。
我正在考虑从 float 切换到整数,但似乎对于整数它的行为是一样的。
编辑:最后的解决方案是微不足道且合乎逻辑的。所以我感谢所有的回答和解释!
最佳答案
在第一个实例中,计算值是恒定的。编译器会在编译时计算c = 0.7 * 0.577 - 0.2 * 0.921
。它甚至可以自由地优化循环,因为它内部没有任何变化(a
、b
和 c
是不变的)。
在第二个实例中,a
和 c
每次迭代都不同,因此必须计算 100000000
次。
关于c - 算术运算的处理时间不成比例 [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797688/