变量vs长算法

variables vs long algorithms

本文关键字:算法 vs 变量      更新时间:2023-10-16

使用这两种算法有什么区别?我一直在想我应该如何优化事情。它们在内存和速度方面有什么不同?一个比另一个好吗?我的意思是,除了代码清晰之外。

这是我的第一个版本:

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

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

优化这段代码的正确方法不是去掉变量(编译器可以为您这样做),而是去掉sqrt操作:只比较平方距离。

哪一个更容易维护?

我认为你的第一个版本更容易,因为它打破了部分,使vectorBetween明显,因为你重复使用了几次。

现在,至于哪一个更快…一个聪明的编译器可能会找出如何使两者具有相同的速度。在你需要的时候不要担心太多。无论如何,我们在这里讨论的是O(1)个差异,所以如果您在一个紧密循环中执行,只需测试两个版本。然后你就会知道哪一个更快!

你觉得最清楚的就去做。如果有性能问题,试试另一个。没有更确切的信息,关于类型D3DXVECTOR3和您正在使用的operator-的返回值任何其他的因素,都是无法猜测的哪个更快。除非你知道这个代码很重要,否则这并不重要。

对于第二个变体,您所能期望的最好情况是编译器将对其进行优化,使其与第一个变体完全相同,而不是计算三次差向量。在任何一种情况下,机器都需要将中间结果存储在某个地方;无论中间存储是c++命名变量还是匿名机器语言指针都无关紧要。

当然,这是不成熟的微优化,与第一个变体更好的可读性相比完全无关。