使用这两种算法有什么区别。我一直想知道我应该如何优化它们。他们如何区分内存和速度?这个比那个好吗?除了代码清晰度,我的意思是。
这是我的第一个版本:
bool Intersects(BoundingSphere boundingSphere)
{
D3DXVECTOR3 vectorBetween = (centre - boundingSphere.centre);
// works out the distance between the sphere centre's using pythag
float distance = sqrt(
pow(vectorBetween.x, 2)
+ pow(vectorBetween.y, 2)
+ pow(vectorBetween.z, 2));
// if two radius's add to more than the distance between the centres
return (radius + boundingSphere.radius > distance);
}
此方法相同,但它不包含变量中的任何值,它只使用一个长计算
bool Intersects(BoundingSphere boundingSphere)
{
return (radius + boundingSphere.radius >
(sqrt(pow((centre - boundingSphere.centre).x, 2) +
pow((centre - boundingSphere.centre).y, 2) +
pow((centre - boundingSphere.centre).z, 2))));
}
答案 0 :(得分:5)
在适当的优化选项下,这两种算法将编译为完全相同的代码。由于第一个更具可读性,因此无疑是两者中更好的。
优化此代码的正确方法不是摆脱变量(编译器可以为您做到这一点),而是摆脱sqrt操作:只是比较平方距离。
答案 1 :(得分:1)
哪一个更容易维护?
我认为您的第一个版本更容易,因为它会突破部分并使vectorBetween
显而易见,因为您重复使用了几次。
现在,关于哪一个更快...一个智能编译器可能会弄清楚如何使两者速度相同。在你需要之前不要太担心。我们无论如何都在讨论O(1)的差异,所以如果你做在紧密循环中执行此操作,只需 test 两个版本。然后你会知道哪一个更快!
答案 2 :(得分:0)
为您做最清楚的事。如果有性能问题,
试试另一个。没有关于类型的更准确的信息
D3DXVECTOR3
以及您正在使用的operator-
的返回值
任何其他因素,甚至不可能做出猜测
这更快。直到你知道这段代码是关键的,它
没关系。
答案 3 :(得分:0)
对于第二个变体,您可以期望的最好的是编译器将优化它以与第一个变量完全相同,而不是三次计算差异向量。在任何一种情况下,机器都需要在某处存储中间结果;这个中间存储是命名C ++变量还是匿名机器语言指针并不重要。
当然,与第一种变体的可读性相比,这是过早的微观优化并且完全不相关。