当我试图优化我的代码时,我经常遇到一个两难的境地:
我有这样的表达:
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;
如果没有,需要多少实例才值得?
尝试优化您的代码通常意味着允许编译器(通过标志)进行自己的优化。尝试自己做会更频繁,要么只是浪费时间(对编译器没有改进),要么更糟。
在您的具体示例中,我严重怀疑您可以做些什么来改变性能。
较旧的编译器优化之一是“公共子表达式消除” - 在这种情况下y * y
是这样一个公共子表达式。
向代码的读者展示表达式只需要计算一次可能仍然有意义,但是过去十年中产生的任何编译器都可以完美地计算出这个,而无需重复乘法。
试图“在自己的游戏中击败编译器”通常是徒劳的,当然需要测量以确保您获得比编译器更好的结果。添加额外的变量可能会导致编译器生成更糟糕的代码,因为它会“混淆”,所以它可能根本没有帮助。
当涉及到来自不同优化的性能(或代码大小)结果时,总是要测量、再次测量、第三次测量,以确保获得预期的结果。通过查看更快和更慢的代码来预测并不是很容易。y * y
但是,即使在编译器中进行了低级别的优化,如果计算两次肯定会感到惊讶。
您不需要临时变量:
int z = y * y;
int x = z + 5
z = z + sqrt(12);
但要确定这是否 (a) 更快并且 (b) 是否真正应该集中注意力,唯一的方法是使用分析器并对整个应用程序进行基准测试。