【发布时间】:2012-02-23 17:15:47
【问题描述】:
当涉及到简写 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));
}
我想知道什么更有效?
min = min > eucl_distance(point_a, point_b) ? eucl_distance(point_a, point_b) : min;
或
double dis = eucl_distance(point_a, point_b);
if (min > dis)
min = dis;
在前一种情况下,编译器(在我的情况下是 GCC 4.6.2)是否知道如何优化 if/else 以保持 eucl_distance() 的返回值以重复使用而不是计算两次?
一个附带的问题是:
什么更有效?
(y.x - x.x)*(y.x - x.x)
或
pow((y.x - x.x),2)
PS:对不起,我只能选择一个正确的答案! :( 谢谢大家的回答!我真的很感激他们!
【问题讨论】:
-
简介!简介!简介!简介!简介!简介!是唯一的答案。
-
我添加了 gcc 作为标签,因为答案可能是编译器特定的。
-
如果有疑问,您可以随时编译代码并手动比较程序集。即使您不知道汇编,如果代码相同,那么您就知道它会针对相同的事物进行优化。但请记住,过早的优化是万恶之源。一般来说,这种优化对你根本没有帮助,除非你已经跟踪了程序并找到了热路径(并且没有更合适的算法)。
-
查看编译后的输出,或对数百万次迭代的循环进行时间/分析。这将是非常特定于编译器的。
-
理论上它们是一样的,但是 pow() 会慢一些,因为当函数被调用时,它需要被放入堆栈并创建你传递给它的数据的副本。话虽这么说,速度上的差异是如此之小,最好只使用 pow ,因为当你获得更高的权力时,你不会有类型 xxxxx .
标签: c++ optimization gcc compiler-construction