性能优化的方法和技巧:概述

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




这是一个可以用一本书来讲的话题,用一系列博客来讲,可能会比较单薄一点,这里只捡重要的说,忽略很多细节,当然以后还可以补充和扩展这个话题。

我以前就说过,性能优化有三个层次:

  • 系统层次
  • 算法层次
  • 代码层次

系统层次关注系统的控制流程和数据流程,优化主要考虑如何减少消息传递的个数;如何使系统的负载更加均衡;如何充分利用硬件的性能和设施;如何减少系统额外开销(比如上下文切换等)。

算法层次关注算法的选择(用更高效的算法替换现有算法,而不改变其接口);现有算法的优化(时间和空间的优化);并发和锁的优化(增加任务的并行性,减小锁的开销);数据结构的设计(比如lock-free的数据结构和算法)。

代码层次关注代码优化,主要是cache相关的优化(I-cache, D-cache相关的优化);代码执行顺序的调整;编译优化选项;语言相关的优化技巧等等。

性能优化需要相关的工具支持,这些工具包括编译器的支持;CPU的支持;以及集成到代码里面的测量工具等等。这些工具主要目的是测量代码的执行时间以及相关的cache miss, cache hit等数据,这些工具可以帮助开发者定位和分析问题。

性能优化和性能设计不同。性能设计贯穿于设计,编码,测试的整个环节,是产品生命周期的第一个阶段;而性能优化,通常是在现有系统和代码基础上所做的改进,属于产品生命周期的后续几个阶段(假设产品有多个生命周期)。性能优化不是重新设计,性能优化是以现有的产品和代码为基础的,而不是推倒重来。性能优化的方法和技巧可以指导性能设计,但两者的方法和技巧不能等同。两者关注的对象不同。性能设计是从正向考虑问题:如何设计出高效,高性能的系统;而性能优化是从反向考虑问题:在出现性能问题时,如何定位和优化性能。性能设计考验的是开发者正向建设的能力,而性能优化考验的是开发者反向修复的能力。两者可以互补。

后续我会就工具,架构,算法,代码,cache等方面展开讨论这个话题,敬请期待。

(7个打分, 平均:4.00 / 5)

雁过留声

“性能优化的方法和技巧:概述”有33个回复

  1. 陈怀临 于 2011-04-10 6:24 下午

    期望你在写这个专题的时候。每个话题都在你想停笔的基础上再折腾一个晚上。 事情往往是再深一点,效果就不一样。
    不要浅尝辄止。。。

  2. Sting 于 2011-04-10 6:27 下午

    不奢望写全,只希望针对某一点写透

  3. kernelchina 于 2011-04-10 7:15 下午

    想要把一个事情系统,完整的说清楚,除了实践外,还需要系统的思考,我会尽力把这个话题写透,当然,评论的启发也很重要。这里有很多高手,也可以指点,交流一下这个话题。

  4. 新手 于 2011-04-10 7:54 下午

    期待您的后续文章

  5. if 于 2011-04-10 8:01 下午

    优化不能缺少量化的信息,基于量化信息可以解决这些问题(举个例子):什么时候使用静态内存,什么时候使用动态内存? 动态与静态的分界线是什么?所谓和谐得恰到好处。

  6. aaron 于 2011-04-10 8:17 下午

    排队等!

  7. Jeff Zhou 于 2011-04-10 10:23 下午

    最近因为工作需要也在做多核下的应用,这里面性能优化可能是最困难的地方了。个人觉得这方面作为知识分享的话,可以更加注重方法论的描述。优化本身是个仁者见仁智者见智的事情,优化的效果评估一方面取决于你的应用场景,另一方面也取决于你的测试方法。我们就曾为了优化算法而设计了一个数学上看起来很棒的hash,结果在早期应用中我们发现hash本身带来的cache miss,使得我们还不如使用linear search。总之是非常期待后续的文章,希望看到一些新的思路。

  8. nana 于 2011-04-10 10:41 下午

    期待

  9. will 于 2011-04-10 11:57 下午

    这方面资料还是蛮多的,我也一直关注这块内容,ps,其实已经有一本书了,而且涵盖了上述的基本内容,从体系架构,到操作系统,到高级语言,就差算法

  10. 理客 于 2011-04-11 12:14 上午

    to will:能否提供一下该书的信息?

  11. 蝎子王 于 2011-04-11 12:27 上午

    这个题目很大。值得期待。

  12. Jack_Wang 于 2011-04-11 12:52 上午

    to will:

    是哪本书呀,给个书名,3x

  13. tom.lai 于 2011-04-11 1:47 上午

    要量化还是要有米的

  14. 草根 于 2011-04-11 6:01 上午

    占座,等====

  15. iosnew 于 2011-04-11 6:35 上午

    to will:
    难道这本书是深入理解计算机系统?
    等答案。

  16. 加菲猫 于 2011-04-11 7:31 上午

    系统层次 设计模式? 搬出前段时间的 “网络系统设计模式”基本所就可以应付了。

    算法层次 应具体需求而定,可深可浅,太泛泛了等于没说,太细的话几本书都写不完。

    至于代码 层面,无非数据结构对齐,cache线对齐,读/写域cache线分离,PerCPU统计/读写分CPU,延迟更新,缩减栈深度 … 这写东西,应该一篇论文的规模就能表达清楚吧?

    期待ing。。。。

  17. kevin 于 2011-04-11 3:47 下午

    关于代码层次的优化,大多时候是把高级语言向低级语言去靠。然后就是将系统层次扁平化,厚的层做薄,薄的层去掉。很多时候philosophy的冲突导致实现困难。性能好了,移植性,维护性差了。老板还不高兴。我现在是越来越不想做这个活了。。。

  18. kernelchina 于 2011-04-11 7:04 下午

    同感,性能优化有时是个出力不讨好的工作,这个就看优化的效果如何了。优化和其他诸如可移植,可维护,可靠性等等是冲突的,而且优化有时只对某个特定的指标有效,写出来好看,但是实际用起来并不那么好用。所以这个活干起来不那么爽,不过可以学到很多东西。

  19. will 于 2011-04-11 8:25 下午

    没想到这么多人对这本书感兴趣,书名叫做An optimization guide for assembly programmers and compiler makers。大家可以去下载看看,内容还不错。

  20. will 于 2011-04-11 8:27 下午

    对于性能优化,我现在在做的事情就遇到这方面问题,高级语言有很多特性,导致性能上有很多代价,比如c++的virtual,导致很多小函数不可以被inline,call的代价打过函数体本身,虽然现在有些编译器提供devritual的功能,但是还是很初级。而很多C++的程序员却非常喜欢用virtual,有时候真的感觉无力呀。

  21. Jack_Wang 于 2011-04-11 8:35 下午

    贴一下这本书的链接:
    http://www.agner.org/optimize/

    原来是Buzz上Jike已经推荐过的,我也下过,但还没顾上看,-。-

  22. will 于 2011-04-11 8:39 下午

    内容比较多,可以挑感兴趣的看,写的还行

  23. westermann 于 2011-04-11 9:47 下午

    这本书的作者居然以VIA的Nano来作为案例,吃惊

  24. 理客 于 2011-04-12 8:29 上午

    性能优化是一个系统成熟过程的必经之路,有相当的含金量,多年前参与过一点

  25. kevin 于 2011-04-12 4:59 下午

    做性能优化,上要对系统/模块层次清楚,下要对高级语言代码与机器码,硬件结构的对应关系清楚。有一定经验的程序员,一次就能写出基本不用优化的代码。没经验的程序员,能把100条指令干完的活写出1000条开外。
    现实往往是前者优化后者的代码,往往这个过程就是边优化边吐血骂娘,恨不得将其的代码重写一遍。最后技术问题变成了政治问题。干脆闭上双眼,承认这个不完美的世界,任其雨打风吹去。。。。。。

  26. will 于 2011-04-13 6:27 下午

    re kevin,我这段时间天天想骂娘

  27. 三千大千世界 于 2011-04-17 7:24 上午

    kernelchian,相当期待您的关于系统性能优化的一系列的讨论。不过有些方法和技巧只是停留在理论层面,就象你说的优化了可能还吃力不讨好,有些可能就非常实用了。
    最简单的一个例子memcopy函数,如果优化得好,性能会提高相当多。我之前就碰到过这样的例子,不过不是我优化的,是intel的工程师做的。牛啊~!

  28. 三千大千世界 于 2011-04-17 7:31 上午

    按照我的理解,性能优化的之前必须要做的是先对系统的performance进行测试,找出bottlenecks,然后再有针对性的优化。比如linux系统上用profile工具,针对不同的处理器是不一样的。
    不知道kernelchina在概述中提到的“工具”是不是就是这个意思?

  29. 黄岩 于 2011-04-17 8:06 上午

    同意,先做分析,找出瓶颈,然后针对性的优化。

    俺碰到过一个例子,在freescale的powerpc上页表设置不合理,没有利用powerpc提供的bat,导致TLB miss过多。最后只改了几行,就解决了。

    开始的时候,找不着头绪,尝试了那多很多方法,包括:修改总线访问周期设置、修改DRAM交错方式、不停修改代码、去掉冗余、修改数据结构优化cache利用率,都不管用。只有找到最瓶颈的那个地方,针对性的修改,才管用。

  30. 老刘· 于 2011-04-17 8:08 上午

    还有hugeTLB in Linux

  31. maple leaf 于 2011-04-21 10:36 下午

    在做设计阶段,就应该考虑性能的质量属性。
    如果软件已经成型,再做系统级的性能优化,工作量、风险以及影响都较大。
    代码级优化:先找热点,然后针对这些热点进行分析,cache使用、减少不必要指令数、减少栈的深度、提高IO总线利用(如IO由每次变成批量访问)、TLB Miss等等。性能是不能一次搞定的,需要建立基线,不停地迭代,不停地确认。
    性能优化很容易降低软件的其他质量属性:如维护性、可扩展性。呵呵~~

  32. 三千大千世界 于 2011-04-23 11:51 下午

    “性能优化很容易降低软件的其他质量属性:如维护性、可扩展性。呵呵~~”
    真是金玉良言啊!

  33. oj 于 2011-05-16 9:19 下午

    我们优化了一个算法,结果市场跟客户说我们增加了内存,升级了CPU,投入了硬件成本,所以要加价。。。。