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快