C++ 代码优化

C++ 代码优化,c++,optimization,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; 如果不是,那么需要多少实例才值得呢?尝试优化代码通常意味着授予编译器进行自身优化的权限(通过标志)。尝试自己去做会比不去做更频繁,要么只是浪费时间(对编译器没有改进

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

我有一个这样的表达:

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;

如果不是,那么需要多少实例才值得呢?

尝试优化代码通常意味着授予编译器进行自身优化的权限(通过标志)。尝试自己去做会比不去做更频繁,要么只是浪费时间(对编译器没有改进),要么更糟


在您的具体示例中,我严重怀疑您是否可以采取任何措施来改变性能。

您不需要临时变量:

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

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

一个较旧的编译器优化是“公共子表达式消除”——在本例中,
y*y
就是这样一个公共子表达式

向代码读者表明表达式只需要计算一次可能仍然有意义,但过去十年中产生的任何编译器都可以在不重复乘法的情况下完美地计算这个表达式

试图“在自己的游戏中击败编译器”通常是徒劳的,当然需要衡量以确保获得比编译器更好的结果。添加额外的变量可能会导致编译器生成更糟糕的代码,因为它会变得“混乱”,因此可能毫无帮助


而且,当涉及到性能(或代码大小)时,总是要测量、再次测量和第三次测量,以确保获得预期的结果。通过查看代码来预测哪个更快,哪个更慢并不容易。但是,即使编译器中的优化程度很低,如果
y*y
计算了两次,肯定会让人感到惊讶。

除非您在寻找最佳猜测答案,否则请通过分析这两个示例自己找出答案。这是一个极其微不足道的优化,你的编译器可能会这样做。打开优化并查看生成的程序集是否有任何差异。你优化的目的是什么?一般来说,优化的目标应该是代码的清晰性,而不是挤出周期。几乎在任何情况下,开发人员的时间都比CPU时间要昂贵得多。通常情况下,这样的优化不是速度/内存优化,而是可读性优化。说
ints=y*y
更易读(IMHO),特别是如果你经常使用
s
。无论是在空间还是时间上,这两种校正都不会有显著的改善