簡體   English   中英

使用 gcc 上的 -Ofast 標志,分解數學表達式會影響速度嗎?

[英]With the -Ofast flag on gcc, does breaking down a math expression affect speed?

我想知道代碼是否使用 gcc 上的 -Ofast 標志

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

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

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

我在嵌套循環中有一個這樣的數學表達式,因此任何速度的提高都可能產生重大影響。

直觀地說,我希望這些能夠編譯成相同的代碼。 但是讓我們看看實際發生了什么! 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]

我相信,這些是相同的指令,但順序略有不同。 我懷疑這兩種情況下的性能幾乎相同,盡管可能(?)管道性能與另一種情況略有不同。

我懷疑您的第一個版本在這里非常好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM