c++ - 重复计算的性能

标签 c++ optimization compiler-optimization

我想知道是否值得进行一次计算并存储结果,还是进行两次计算更快?

例如在这种情况下:

float n1 = a - b;
float n2 = a + b;
float result = n1 * n2 / (n1 * n2);

这样做更好吗:

float result = (a - b) * (a + b) / ((a - b) * (a + b));

? 我知道通常我们会存储结果,但我想知道做加法是否比调用内存来存储/检索值更快。

最佳答案

这真的取决于:对于像您这样的微不足道的例子,这并不重要。编译器将生成相同的代码,因为它找到了共同的子表达式并消除了重复的计算。

对于更复杂的示例,例如涉及函数调用,您最好使用第一个变体来“存储”中间结果。不要担心使用简单变量进行中间存储。这些通常都保存在 CPU 寄存器中,编译器非常擅长将值保存在寄存器中。

危险在于,对于更复杂的计算,编译器可能无法执行公共(public)子表达式消除。例如,当您的代码包含充当编译器边界的函数调用时就是这种情况。

另一个主题是,对于 float ,即使是加法这样的简单运算也不具有关联性,即 (a+b)+c 不同于 a+(b+c),这是由于最低位的伪影。这通常还会阻止公共(public)子表达式消除,因为不允许编译器更改代码的语义。

关于c++ - 重复计算的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54733084/

相关文章:

C++在可变参数模板内专门化可变参数模板

matlab - Matlab 中的凸优化

c++ - 将 C++ 编译成尽可能小的尺寸

c++ - 游戏编程

c++ - 在 C++ 中获取使用 HTML 表单发送的 POST 参数

c++ - 为什么这个 C++ 程序可以在 MacOS 上编译,但不能在 Ubuntu 上编译?

django:预取 GenericForeignKey 的相关对象

python - 我可以通过匹配键作为前缀来在字典中保留新词吗

swift - Swift 中的 weak vs unowned。内部差异是什么?

cuda - CUDA 11 中的链接时优化 - 它们是什么以及如何使用它们?