我想知道,在gcc上使用-Ofast标志时,代码中的
x += (a * b) + (c * d) + (e * f);
是更快,更慢,同样是这段代码。
x += a * b;
x += b * c;
x += e * f;
我在一个嵌套循环里有一个这样的数学表达式 所以任何速度上的提升都会有显著的效果。
直觉上,我希望这些代码能编译成同样的代码。但让我们看看实际情况 使用 榫头 和你的第一个版本(单行本),我们得到这个代码。
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
With 第二版我们得到这个
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]
我相信,这些是相同的指令,但顺序略有不同。我猜测这两种情况下的性能几乎是一样的,尽管其中一种与另一种的流水线性能可能(?)会有轻微的差异。
我怀疑你的第一个版本在这里是完全可以的。