c - 使用 gcc 上的 -Ofast 标志,分解数学表达式会影响速度吗?
问题描述
我想知道是否使用 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]
我相信,这些是相同的指令,但顺序略有不同。我怀疑这两种情况下的性能几乎相同,尽管可能(?)管道性能与另一种情况略有不同。
我怀疑您的第一个版本在这里非常好。
推荐阅读
- sql - Azure SQL 数据库备份菜单不可用
- c# - Linq 按特定枚举值排序
- amazon-web-services - 如何解决 botocore.exceptions.NoCredentialsError:无法找到凭据
- c# - 什么是有效的 C#/EDM 标识符?
- python - Django:为什么 Django 不翻译单词
- r - 如何使用 purrr::map 系列将函数直接应用于数据框列表,而不是创建新对象
- javascript - 动态 Nuxt 页面选择
- r - 适合列表的 gofstat 问题
- c# - 使用 EMGU CV 进行模板匹配
- node.js - 将 MQTT 数据输出到 Node-Red 图中