变量与长算法

时间:2011-10-11 12:57:23

标签: c++ performance

使用这两种算法有什么区别。我一直想知道我应该如何优化它们。他们如何区分内存和速度?这个比那个好吗?除了代码清晰度,我的意思是。

这是我的第一个版本:

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))));
}

4 个答案:

答案 0 :(得分:5)

在适当的优化选项下,这两种算法将编译为完全相同的代码。由于第一个更具可读性,因此无疑是两者中更好的。

优化此代码的正确方法不是摆脱变量(编译器可以为您做到这一点),而是摆脱sqrt操作:只是比较平方距离。

答案 1 :(得分:1)

哪一个更容易维护?

我认为您的第一个版本更容易,因为它会突破部分并使vectorBetween显而易见,因为您重复使用了几次。

现在,关于哪一个更快...一个智能编译器可能会弄清楚如何使两者速度相同。在你需要之前不要太担心。我们无论如何都在讨论O(1)的差异,所以如果你在紧密循环中执行此操作,只需 test 两个版本。然后你会知道哪一个更快!

答案 2 :(得分:0)

为您做最清楚的事。如果有性能问题, 试试另一个。没有关于类型的更准确的信息 D3DXVECTOR3以及您正在使用的operator-的返回值 任何其他因素,甚至不可能做出猜测 这更快。直到你知道这段代码是关键的,它 没关系。

答案 3 :(得分:0)

对于第二个变体,您可以期望的最好的是编译器将优化它以与第一个变量完全相同,而不是三次计算差异向量。在任何一种情况下,机器都需要在某处存储中间结果;这个中间存储是命名C ++变量还是匿名机器语言指针并不重要。

当然,与第一种变体的可读性相比,这是过早的微观优化并且完全不相关。