为啥当我使用变量存储数值结果而不是重新计算时,C++ 程序运行速度较慢?

Posted

技术标签:

【中文标题】为啥当我使用变量存储数值结果而不是重新计算时,C++ 程序运行速度较慢?【英文标题】:Why the C++ program run slower when I use a variable to store the numeric result instead of calculating it over again?为什么当我使用变量存储数值结果而不是重新计算时,C++ 程序运行速度较慢? 【发布时间】:2018-10-21 11:27:56 【问题描述】:

我正在编写一个简单的 C++ 函数来反转整数,如下所示:

int reverse(int x) 
    int result = 0;
    int overflow_max = INT_MAX / 10;
    int underflow_min = INT_MIN / 10;

    while (x != 0) 
        int pop = x % 10;
        if (result > overflow_max || (result == overflow_max && pop > 7)) 
            return 0;
        if (result < underflow_min  || (result == underflow_min && pop < -8)) 
            return 0;
        result *= 10;
        result += pop;
        x /= 10;
    

    return result;

该程序运行良好且快速。但是,当我在测试不同版本的代码优化功能时,我发现这个版本的运行速度略快:

int reverse(int x) 
    int result = 0;

    while (x != 0) 
        int pop = x % 10;
        if (result > INT_MAX / 10 || (result == INT_MAX / 10 && pop > 7)) 
            return 0;
        if (result < INT_MIN / 10 || (result == INT_MIN / 10 && pop < -8)) 
            return 0;
        result *= 10;
        result += pop;
        x /= 10;
    

    return result;

我不明白第二个版本运行速度更快的原因,因为它显然重复了 INT_MAX / 10 和 INT_MIN / 10 的计算,所以它的性能应该比使用临时变量存储的第一个版本更差避免重复计算。

【问题讨论】:

弹性测量数据和minimal reproducible example好吗? 你是怎么编译的?什么优化级别?使这些变量const 并再次检查。 INT_MAX / 10 是编译时常量,不在运行时计算。 您是如何衡量性能的?你是在调试还是发布模式下运行的? 你是如何分析这段代码的?你是如何编译这段代码的?其余代码在哪里...这是一个不完整的 sn-p。 您的编译器和优化设置是什么?带有-O2 的 gcc 为两者生成相同的代码(如果两者都有,它甚至会用跳转到另一个替换一个)。 【参考方案1】:

INT_MAX 是 #define10 是常量文字,因此,INT_MAX/10 是常量,因此在编译期间只会计算一次。

另一方面,overflow_max 未定义为常量,并且根据优化级别,可能会在循环比较期间导致对读取值的额外内存访问。

【讨论】:

此外,当overflow_maxoverflow_min 为常量时,clang 为这两个函数生成完全相同的代码。 godbolt.org/z/FBoJs9

以上是关于为啥当我使用变量存储数值结果而不是重新计算时,C++ 程序运行速度较慢?的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中,int类型存储的最大的数是2^32,为啥?为啥不是2^31

当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?

MYSQL选择进入变量而不是将结果存储在存储过程中的变量中。

SPSS 回归分析计算变量均值这里,这样输入有啥问题吗,为啥确定后数值是无?求大神帮忙

为啥c#中bool要占4个字节 32位呢 为啥不用像byte 1个字节存储呢

c++中,如果int a;cin>>a;cout<<a; 在输入时输入一个字母c ,为啥输出结果为-858993460,而不是c的码值