数学规划优化

3

我想编制一份关于数学编程优化的技巧和诀窍列表,通常我在论坛中读到这样的内容:

  1. 使用距离平方值比较距离,因为平方根计算更昂贵
  2. (变量* 0.5)比(变量/ 2.0)更快

作为一个编程爱好者,我希望在优化方面尽力而为,非常感谢您的任何贡献。


1
投票通过,将迁移到“程序员堆栈交换”。 - Petar Minchev
1
这些“优化”可能并非所有(其中(1)是,但(2)就不是那么多了)。 - Konrad Rudolph
2个回答

4

两个关键点。

  • 测量 - 不要假设你知道什么是缓慢的和/或为什么。在实际生产代码中进行测量。然后只担心占用大部分时间的部分。
  • 优化算法而不是代码。查找o(N^2)而不是o(N)或o(N)而不是o(ln(N))的操作,并切换到具有更好渐进行为的算法。

2
我认为,在考虑优化之前,首先要确定库的范围和预期目的。例如,这个库是2D还是3D的?它是否包含几何算法,如凸包?
像大多数开发此类库的人一样,您将遇到一些不可避免的问题。例如精度误差有时确实会让您发疯。还要注意退化三角形。
仔细考虑包括epsilon或容限的算法。这是一个很好的功能,但会使您的算法更加复杂。
如果您涉足3D领域,请分别处理点和向量(这是3D数学中最常见的问题之一)。考虑使用元编程进行模板乘法(我感觉这个会被批评),因为它可以大大加快渲染速度。
总的来说,尽量避免除了实质性算法以外的任何虚拟调用,如向量或点等小类不应该被继承(又是另一个被批评的机会)。
我建议从坚持良好的开发实践开始,阅读Scott Meyers的《Effective C++》和《More Effective C++》。如果您采取了捷径,例如将平方值与根号计算进行比较,请注释您的代码,以便未来的开发人员可以理解数学。
最后,不要试图过度优化,使用分析器进行优化。个人经验是,我经常先编写最优雅的解决方案(应该说是我认为最优雅的解决方案),然后再进行优化,您会惊讶于C++优化器通常能够完成多好的工作。
希望这可以帮助您。
马丁

关于虚拟调用,我认为如果每个虚拟调用执行的有用任务足够大,则虚拟调用的开销可能相对不重要。因此,请尝试将几个相关操作“打包”到每个虚拟调用中。 - rwong
保留优雅的源代码和手动优化的源代码。我见过开发人员从源代码控制中删除优雅版本 - 这会带走后来的开发人员理解优化版本所需的上下文(也失去了比较基准)。 - rwong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接