首页 > 解决方案 > 使用 gcc 上的 -Ofast 标志,分解数学表达式会影响速度吗?

问题描述

我想知道是否使用 gcc 上的 -Ofast 标志,代码

x += (a * b) + (c * d) + (e * f);

比此代码更快/更慢/相同/相同:

x += a * b;
x += b * c;  
x += e * f;

我在嵌套循环中有一个这样的数学表达式,因此任何速度的提高都可能产生重大影响。

标签: cmathgcccompiler-optimization

解决方案


直观地说,我希望这些能够编译成相同的代码。但是让我们看看实际发生了什么!将Godbolt与您的第一个版本(单线)一起使用,我们得到以下代码:

    mov     eax, DWORD PTR [rsp+20]
    mov     esi, DWORD PTR [rsp+28]
    imul    esi, DWORD PTR [rsp+32]
    imul    eax, DWORD PTR [rsp+24]
    lea     eax, [rax+rsi]
    mov     esi, DWORD PTR [rsp+36]
    imul    esi, DWORD PTR [rsp+40]
    add     esi, eax
    add     esi, DWORD PTR [rsp+44]
    mov     DWORD PTR [rsp+44], esi

使用第二个版本,我们得到:

    mov     esi, DWORD PTR [rsp+28]
    imul    esi, DWORD PTR [rsp+32]
    mov     eax, DWORD PTR [rsp+20]
    imul    eax, DWORD PTR [rsp+24]
    add     eax, DWORD PTR [rsp+44]
    lea     eax, [rax+rsi]
    mov     esi, DWORD PTR [rsp+36]
    imul    esi, DWORD PTR [rsp+40]
    add     esi, eax
    mov     DWORD PTR [rsp+44], esi]

我相信,这些是相同的指令,但顺序略有不同。我怀疑这两种情况下的性能几乎相同,尽管可能(?)管道性能与另一种情况略有不同。

我怀疑您的第一个版本在这里非常好。


推荐阅读