我想知道是否值得进行一次计算并存储结果,还是进行两次计算更快?
例如在这种情况下:
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/