变量vs长算法
variables vs long algorithms
使用这两种算法有什么区别?我一直在想我应该如何优化事情。它们在内存和速度方面有什么不同?一个比另一个好吗?我的意思是,除了代码清晰之外。
这是我的第一个版本:
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++命名变量还是匿名机器语言指针都无关紧要。
当然,这是不成熟的微优化,与第一个变体更好的可读性相比完全无关。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- 算法问题:查找从堆栈中弹出的所有序列
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- Dijkstra 最短路径算法性能 std::p riority_queue VS std::set.
- 变量vs长算法