【问题标题】:Math programming optimization [closed]数学编程优化
【发布时间】:2011-10-05 08:57:52
【问题描述】:

我想整理一份关于数学规划优化的技巧和窍门的列表,我经常在论坛上看到这样的内容:

  1. 使用距离平方值比较距离,因为平方根 计算成本更高
  2. (variable * 0.5) 比 (variable / 2.0) 快

作为一名编程爱好者,我希望在优化方面尽我所能,任何贡献都将不胜感激

【问题讨论】:

  • 投票转至programmers.stackexchange
  • 这些“优化”可能没有任何意义(嗯,(1)是但(2)不是那么多)。

标签: math optimization


【解决方案1】:

两个关键点。

  • 测量 - 不要假设您知道什么是慢和/或为什么。在实际生产代码中测量它。然后,只需担心占用您大部分时间的部分即可。
  • 优化您的算法而不是您的代码。寻找你正在做的事情是 o(N^2) 而不是 o(N) 或者是 o(N) 而不是 o(ln(N)) 并切换到具有更好渐近行为的算法。

【讨论】:

    【解决方案2】:

    我想说,在考虑优化之前,首先要确定的是库的范围和预期用途。例如,这个库是 2D 还是 3D,它是否包含几何算法,如凸包?

    像大多数开发此类库的人一样,您会遇到一些不可避免的问题。诸如精度错误之类的事情有时肯定会让您发疯。也要小心退化的三角形。

    仔细考虑包含 epsilon 或容差的算法。这是一个很好的功能,但它会使您的算法更加复杂。

    如果您涉足 3D 世界,请区别对待点和矢量(这是 3D 数学中最常见的问题之一)。考虑用于模板乘法的元编程(我感觉这个会火的),因为它可以大大加快渲染速度。

    一般来说,尽量避免对实体算法以外的任何东西进行虚拟调用,不应继承向量或点等小类(另一个燃烧的机会)。

    我想说,从坚持良好的开发实践开始,阅读 Scott Meyers 的 Efficient C++ and More Efficient C++ 如果您采取捷径,例如比较平方值以避免平方根计算,请评论您的代码,以便未来的开发人员可以理解数学。

    最后,不要尝试过度优化,为此使用分析器。就我个人而言,我经常从编写最优雅的解决方案开始(我应该说我认为最优雅的解决方案),然后进行优化,您会惊讶于 C++ 优化器通常做得多么出色。

    希望对你有帮助

    马丁

    【讨论】:

    • 关于虚拟调用,我想说如果per虚拟调用执行的有用任务足够大,那么虚拟调用的开销可以相对微不足道。因此,尝试将几个相关操作“打包”到每个虚拟调用中。
    • 保留优雅的源代码和手动优化的源代码。我已经看到开发人员从源代码​​控制中删除了优雅的版本 - 这消除了以后开发人员理解优化版本所需的上下文(并且也失去了比较的基线)。
    猜你喜欢
    • 2018-05-05
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多