Tu *_*ang 1 c++ compiler-construction optimization gcc
关于if/else的缺点,关于编译器的优化,我有这个问题.
我有这个功能:
double eu_distance (const coor& x, const coor& y) {
return ((y.x - x.x)*(y.x - x.x) + (y.y - x.y)*(y.y - x.y));
}
Run Code Online (Sandbox Code Playgroud)
我想知道什么更有效率?
min = min > eucl_distance(point_a, point_b) ? eucl_distance(point_a, point_b) : min;
Run Code Online (Sandbox Code Playgroud)
要么
double dis = eucl_distance(point_a, point_b);
if (min > dis)
min = dis;
Run Code Online (Sandbox Code Playgroud)
在前一种情况下,编译器(在我的情况下,GCC 4.6.2)是否知道如何优化if/else以保持eucl_distance()的返回值重用而不是计算两次?
背驮式问题是:
什么更有效?
(y.x - x.x)*(y.x - x.x)
Run Code Online (Sandbox Code Playgroud)
要么
pow((y.x - x.x),2)
Run Code Online (Sandbox Code Playgroud)
PS:对不起,我不能选择一个以上的正确答案!! :(谢谢大家的答案!我真的很感激他们!
没有通用的答案:您必须分析您的实现生成的代码以确定.但是,在大多数情况下,如果
eu_distance是在一个单独的翻译单元中,并且没有特别注释,编译器将无法知道使用相同的参数调用它两次将得到相同的结果; 在这种情况下,第二种形式几乎肯定会更快.另一方面,如果
eu_distance可以内联,任何体面的优化器最终都会为两者生成几乎完全相同的代码.
在实践中,我几乎肯定会使用第三种形式:
min = std::min( eu_distance( point_a, point_b ), min );
Run Code Online (Sandbox Code Playgroud)
(我认为这eucl_distance是一个错字eu_distance.)
另外,我会避免像这样的名字min.有人太可能在没有定义的情况下添加更
using namespace std;晚,甚至包括.(定义和是否为宏尚未确定.如果你定义自己这导致了一些有趣的错误信息或.甚至包括.)<windows.h>NOMINMAX<windows.h>minmaxNOMINMAXminmax<algorithm>
关于pow( x, 2 ):再次,你真的必须衡量,但通常x * x会更快,即使x是一个复杂的表达.(当然,如果表达式是非常重要的,那么认识到两者x都是相同的可能并不那么容易,这使得代码更难以阅读.在这种情况下,你可能想要考虑一个小函数,比如squared,除了返回
x * x.如果它在性能方面有所不同,请将其内联.)
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |