代码优化

时间:2013-07-12 16:09:13

标签: c++ optimization

当我试图优化我的代码时,我常常陷入两难境地:

我有一个这样的表达式:

int x = 5 + y * y;
int z = sqrt(12) + y * y;

是否值得制作一个新的整数变量来存储两个实例的y * y,还是只留下它们?

int s = y* y;
int x = 5 + s;
int z = sqrt(12) + s;

如果没有,它需要多少个实例呢?

3 个答案:

答案 0 :(得分:4)

尝试优化代码通常意味着为编译器提供权限(通过标志)来进行自己的优化。试图自己做这件事往往不是,或者只是浪费时间(没有改进编译器)或更糟糕。

在您的具体示例中,我严重怀疑您可以采取哪些措施来改变效果。

答案 1 :(得分:1)

较旧的编译器优化之一是“公共子表达式消除” - 在这种情况下,y * y是一个常见的子表达式。

向代码的读者展示表达式只需要计算一次就可能仍然有意义,但是在过去十年中生成的任何编译器都会在不重复乘法的情况下完美地计算出来。

试图“在自己的游戏中击败编译器”通常是徒劳的,当然需要测量以确保获得比编译器更好的结果。添加额外的变量可能会导致编译器产生更糟糕的代码,因为它会“混淆”,所以它可能根本没用。

并且总是在性能(或代码大小)方面产生不同的优化,测量,再次测量和第三次测量,以确保获得预期的结果。通过查看更快,更慢的代码来预测并不是很容易。但如果y * y计算两次,即使编译器中的优化程度很低,也一定会感到惊讶。

答案 2 :(得分:0)

您不需要临时变量:

int z = y * y;
int x = z + 5
z = z + sqrt(12);

但唯一的方法是确保(a)更快和(b)真正应该集中注意力的方法是使用分析器并对整个应用程序进行基准测试。

相关问题