C++ 变量与长算法

C++ 变量与长算法,c++,performance,C++,Performance,使用这两种算法的区别是什么。我一直在想我应该如何优化事情。它们在记忆和速度方面有什么不同?一个比另一个好吗?除了代码清晰之外,我的意思是 这是我的第一个版本: bool Intersects(BoundingSphere boundingSphere) { D3DXVECTOR3 vectorBetween = (centre - boundingSphere.centre); // works out the distance between the sphere centr

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

这是我的第一个版本:

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操作:只需比较平方距离。

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


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

哪一个更容易维护

我认为您的第一个版本更容易,因为它分解了各个部分,并使
之间的向量
变得明显,因为您多次重复使用了它


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

哪一个更容易维护

我认为您的第一个版本更容易,因为它分解了各个部分,并使
之间的向量
变得明显,因为您多次重复使用了它


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

做对你来说最清楚的事。如果出现性能问题, 试试另一个。没有更准确的信息,关于
D3DXVECTOR3
和正在使用的
运算符的返回值-
,以及 任何其他因素,都不可能对 哪个更快。在您知道这段代码很关键之前,它
没关系

做对你来说最清楚的事。如果出现性能问题, 试试另一个。没有更准确的信息,关于
D3DXVECTOR3
和正在使用的
运算符的返回值-
,以及 任何其他因素,都不可能对 哪个更快。在您知道这段代码很关键之前,它
没关系

对于第二个变量,您所能期望的最好结果是编译器将对其进行优化,使其与第一个变量完全相同,而不是三次计算差分向量。无论哪种情况,机器都需要将中间结果存储在某个地方;中间存储是一个命名的C++变量还是一个匿名的机器语言指针并不重要。
当然,这是过早的微观优化,与第一个变量更好的可读性相比完全不相关。

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

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

第二个变体需要更多的计算,而第一个变体有一个浮点数和一个与之相关的结构……您测试过这两个变体的性能吗?如果没有,请先这样做,然后询问您是否需要帮助解释结果。您可能应该改为分析。所有的编译器都能优化通用的子表达式。一旦对第一个版本的调用结束,内存就会被清除。所以从记忆上看,它们是一样的。速度::如果编译器确实优化了“(center-boundingSphere.center)”,那么版本2应该更快,否则版本1不需要使用
pow(x,2)
其中
x*x
就足够了。顺便说一句:保存您自己的函数调用:-)第二个需要更多的计算,虽然第一个有一个float和一个struct与之关联,但是您测试过这两个的性能了吗?如果没有,请先这样做,然后询问您是否需要帮助解释结果。您可能应该改为分析。所有的编译器都能优化通用的子表达式。一旦对第一个版本的调用结束,内存就会被清除。所以从记忆上看,它们是一样的。速度:如果编译器确实进行了优化(center-boundingSphere.center),那么版本2应该更快,否则版本1不需要使用
pow(x,2)
其中
x*x
就足够了,顺便说一句:保存一个函数调用:-)此外,您可能会发现
x*x
pow(x,2)快
@MikeSeymour即使在编译器处理它之后?@Sir:因为如果
sqrt(x1*x1+y1*y1)>sqrt(x2*x2+y2*y2)
那么
(x1*x1+y1*y1)>(x2*x2+y2*y2)
sqrt
是单调的。@先生:编译器只能将
pow(x,2)
优化为
x*x
,如果它可以确定您没有链接到另一个名为
pow
@SirYakalot的函数中:只要您使用乘法而不是
pow
,平方运算几乎肯定比ta快