我编写了以下代码来计算两个圆的交叉点。代码简单而且足够快。并不是说我需要更多优化,但我可以考虑更积极地优化这些代码。例如,public boolean shouldIgnore(String description){
char [] arr = description.toCharArray();
boolean slashFound = false;
if(!isItANumber(arr[0])){
return true;
}
for(int i=1 ; i<arr.length ; i++){
if(isItANumber(arr[i])){
continue;
}
else{
if(!slashFound){
if(arr[i]=='/'){
if(!isItANumber(arr[i+1]))
return true;
slashFound = true;
i++;
continue;
} else{
return true;
}
} else{
if(arr[i]=='.'){
return false;
} else{
return true;
}
}
}
}
return false;
}
public boolean isItANumber(char c){
return (int)c >= 48 && (int)c <=57;
}
和h/d
计算两次(让我们忘记编译器优化)。
1.0/d
我的问题是我们可以信任多少C ++编译器(这里是g ++)来理解代码并优化最终的二进制文件? g ++可以避免两次const std::array<point,2> intersect(const circle& a,
const circle& b) {
std::array<point,2> intersect_points;
const float d2 = squared_distance(a.center, b.center);
const float d = std::sqrt(d2);
const float r12 = std::pow(a.radious, 2);
const float r22 = std::pow(b.radious, 2);
const float l = (r12 - r22 + d2) / (2*d);
const float h = std::sqrt(r12 - std::pow(l,2));
const float termx1 = (1.0/d) * (b.center.x - a.center.x) + a.center.x;
const float termx2 = (h/d)*(b.center.y - a.center.y);
const float termy1 = (1.0/d) * (b.center.y - a.center.y) + a.center.y;
const float termy2 = (h/d)*(b.center.x - a.center.x);
intersect_points[0].x = termx1 + termx2;
intersect_points[0].y = termy1 - termy2;
intersect_points[1].x = termx1 - termx2;
intersect_points[1].y = termy1 + termy2;
return intersect_points;
}
吗?更准确地说,我想知道这条线在哪里。什么时候我们应该对编译器进行精细调整以及何时进行优化?
答案 0 :(得分:1)
如今流行的编译器在优化方面相当不错。
优化程序很可能会检测到1.0/d
之类的常见表达式,因此请不要关心此问题。
优化程序更不可能将std:pow( x, 2 )
替换为x * x
。
这取决于您使用的确切函数,您使用的编译器版本以及优化命令行开关。所以在这种情况下,你最好写x * x
。
很难说优化器可以走多远,当你作为一个人必须接管时,这取决于如何&#34; smart&#34;优化器是。但根据经验,编译器可以优化它可以从代码行中扣除的东西。
例:
编译器会知道这个术语总是错误的:1 == 2
但它无法知道这也总是错误的:1 == nextPrimeAfter(1)
,因为它必须知道函数nextPrimeAfter()
的作用。