常见的优化规则

时间:2010-05-19 10:26:30

标签: optimization

这是一个危险的问题,所以让我试着正确地说出来。过早优化是所有邪恶的根源,但如果你知道你需要它,那么应该考虑一套基本的规则。这套是我想知道的。

例如,想象一下你有几千件物品的清单。如何查找具有特定ID的项目?当然,您只需使用Dictionary将ID映射到项目。

如果您知道存储在数据库中的设置始终是必需的,您只需缓存它而不是每秒发送数百次数据库请求。

甚至可以像在prod中使用版本而不是调试版本一样简单。

我想还有一些更基本的想法。

我特别正在寻找“不要这样做,对于专家:不要这样做”或“使用探查器”答案,但对于非常简单的一般提示。如果你认为这是一个有争议的问题,你可能会误解我的意图。

我也不是在寻找任何项目的具体建议,也不是任何复杂的低级技巧。可以把它想象成如何避免作为初学者所犯的最重要的性能错误。

编辑:这可能是我正在寻找的一个很好的描述:为具有基本技术理解的人创建一个通用优化规则的演示文稿(不是实际示例)(假设他们说获得了CS学位)但由于某种原因从未写过一行代码。指出最重要的方面。伪代码很好。不要假设特定语言甚至架构。

5 个答案:

答案 0 :(得分:5)

两条规则:

  • 使用正确的数据结构。

  • 使用正确的算法。

我认为这涵盖了它。

答案 1 :(得分:3)

  • 尽量减少网络往返次数
  • 尽量减少硬盘搜索次数

这比你的程序可能做的任何其他事情要慢几个数量级,所以避免它们确实非常重要。实现这一目标的典型方法是:

  • 缓存
  • 增加网络和高清访问的粒度

例如,B-Trees在数据库系统中绝对无处不在,因为它减少了磁盘索引查找的高清访问粒度。

答案 2 :(得分:1)

我认为非常重要的一点就是要经常执行所有代码。这通常是关键内循环中的代码。

规则1:了解此代码

对于此代码,请避免所有开销。运行时的微小差异会对整体性能产生重大影响。例如。如果你实现一个图像过滤器,每个像素0.001ms的差异将在尺寸为1000x1000(不大)的图像上的过滤器运行时间中产生1s的差异。

内循环中要避免/做的事情是:

  • 不要通过接口(例如数据库查询,RPC调用等)
  • 不要在RAM中跳转,尝试线性访问
  • 如果你必须从磁盘读取然后读取内部循环(分页)之外的大块
  • 避免虚拟函数调用
  • 避免函数调用/使用内联函数
  • 尽可能使用float而不是double
  • 尽可能避免数字演员
  • 在C ++中使用++ a而不是++;
  • 如果可能,直接迭代指针

第二个一般建议:每个层/接口成本,尽量避免大量不同的技术,系统将花费更多的时间进行数据转换然后在做实际的工作,保持简单。

正如其他人所说,使用正确的算法,在优化算法实现之前,首先尝试优化算法复杂度。

答案 3 :(得分:1)

我知道你正在寻找特定的编码提示,但很容易找到:缓存,循环展开,代码提升,数据和放大器。代码区域,等等,等等...

最大的暗示是不要使用它们

如果我说“这是全能的力量不要让你知道的秘密!!”,这有助于说明这一点吗?选择你的权力:微软,谷歌,太阳等等。

不要使用它们

直到你知道,确定无疑,问题是什么,然后编码提示是显而易见的。

Here's an example where many coding tricks were used, but the heart and soul of the exercise is not the coding techniques, but the diagnostic technique.

答案 4 :(得分:0)

你的算法是否适合这种情况还是有更好的算法?