2010-05-19 121 views
2

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

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

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

甚至像在产品中使用版本而不是调试版本一样简单。

我想还有几个更基本的想法。

我是专门为而不是寻找“不要这样做,专家:不要这样做”或“使用探查器”的答案,但真的很简单,一般的提示。如果你觉得这是一个有争议的问题,你可能会误解我的意图。

我也没有在我的任何项目中寻找具体的建议,也没有找到任何复杂的低级技巧。把它看作是如何避免你作为初学者所犯的最重要的性能错误的概述。

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

+0

我之间作为一个年轻的降压程序员,我作为一个老态龙钟的老程序员的区别,是这样的:作为一个年轻的程序员,我以为*数据结构是它是在*作为一个老程序员谁是专家在。优化,性能不佳的最大和最糟糕的原因是*奔放的普遍性* - 有很多“抽象”,通知,“隐藏”的方式夸大的数据结构设计,人们做出这么多事情的所有东西。 – 2010-05-20 12:12:18

回答

0

您的算法是否正确,或者有更好的算法?

5

两个规则:

  • 使用正确的数据结构。

  • 使用正确的算法。

我认为它涵盖了它。

+0

它确实似乎涵盖了这个话题,但我更喜欢_little_更多细节:) – mafu 2010-05-19 10:30:16

3
  • 最小化网络数量的往返
  • 最大限度地减少硬盘的数量寻求

这些幅度慢于其他任何程序可能会做几个数量级,因此避免了他们可以很确实很重要。典型的方法来实现这一目标是:

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

例如,B-Trees绝对是无处不在DB系统,因为减少的HD访问的粒度磁盘索引查找。

+0

我会添加诸如“不必要”或“缓存频繁xxx的结果”? – mafu 2010-05-19 10:36:34

1

我认为一件非常重要的事情是要对所有经常执行的代码非常小心。这通常是关键内部循环中的代码。规则1:知道此代码

为此代码避免所有开销。运行时间的小差异会对整体性能产生重大影响。例如。如果实现图像滤镜,每像素0.001毫米的差异会使滤镜运行时间在尺寸为1000x1000(不大)的图像上产生1秒的差异。

需要避免的事项/在内环做是:

  • 不通过接口去(如数据库查询,RPC调用等)
  • 没有在RAM跳来跳去,试图访问它线性
  • ,如果你有从磁盘中读取然后读内环外大块(分页)
  • 避免虚函数
  • 调用
  • 避免函数调用/使用内联函数
  • 使用浮动而不是双如果可能
  • 避免数值投射如果可能
  • 使用++的代替在C++上指针如果可能

第二一般建议一个++

  • 迭代直接:每个层/接口成本,尽量避免大量不同的技术,系统会花费更多的时间进行数据转换,然后再做实际的工作,保持简单。

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

  • +0

    尽管像++ a vs a ++这样的东西可以(_way!_)具体化,但我赞成内部循环和大型堆栈的想法。 – mafu 2010-05-20 09:10:46

    1

    我知道你正在寻找具体的编码提示,但这些都是很容易找到:cacheing,循环展开,代码吊装,数据&代码位置,等等,等等...

    其中最大的提示是不要使用它们

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

    没有使用这些

    直到你知道,死的肯定,有什么问题,然后编码提示是明显。

    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.

    +0

    该问题不包括优化需求和链接中列出的特定技巧。我真的只是要求最基本的想法。 – mafu 2010-05-20 09:08:03

    +0

    @mafutrct:最基本的想法是这样的:在程序运行时手动中断(暂停)程序,并检查它在做什么以及为什么。调用堆栈及其状态通常会告诉它正在做什么以及为什么。 (有些类型的代码在这种情况下不起作用,但它们很少。)多次执行此操作。要优化的点非常明显,它们出现的时间百分比是他们可以节省的时间百分比。这很简单。当你知道问题出在哪里时,你的大脑会确定如何优化它。 – 2010-05-20 11:38:30

    +0

    @mafutrct:如果你浏览SO,你会发现有少数人发现了这一点。我在1978年用小型机RDS-500发现它。我已经在8080,8086,8088,68K,Vax,x86,Unix,Windows,包括Java和C#在内的所有语言中使用过它。它永远不会失败。人们用轮廓仪喋喋不休地咆哮着,而随机停止则是低科技,但每次都立即引发问题。人们需要知道这一点,因为它是有用的。所以优化的秘诀并不是特定的编码技巧,它是*如何发现问题。* – 2010-05-20 11:58:21