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

标签 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);
}

注意,有一行被注释掉了。

我是先不加行再加行编译的。 (使用 gcc -O2 ...)。并测量了处理时间。我很惊讶地发现执行时间是 0.001s 而不是 2.444s。这没有多大意义。或者更确切地说,这背后一定有某种逻辑。

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

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

我正在考虑从 float 切换到整数,但似乎对于整数它的行为是一样的。

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

最佳答案

在第一个实例中,计算值是恒定的。编译器会在编译时计算c = 0.7 * 0.577 - 0.2 * 0.921。它甚至可以自由地优化循环,因为它内部没有任何变化(abc 是不变的)。

在第二个实例中,ac 每次迭代都不同,因此必须计算 100000000 次。

关于c - 算术运算的处理时间不成比例 [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797688/

相关文章:

c - 如何禁用几行代码的 GCC 警告

c - 定义测试替身时如何避免多重定义

c++ - 更改 Windows 资源管理器中的当前路径

c# - 写入内存映射文件比非内存映射文件慢

php - phpbench 中的革命和迭代有什么区别?

c++ - 编译 rcpp 时遇到问题

windows - 如何在 Microsoft Visual Studio 中使用 GCC?

c - 双核字数统计速度慢

c - 使用 calloc 将内存分配给 Struct 变量时出现段错误

mysql - SQL 中的 JOIN 的成本如何?和/或,性能和标准化之间的权衡是什么?