性能优化的方法和技巧:概述
作者 kernelchina | 2011-04-10 17:57 | 类型 行业动感 | 33条用户评论 »
系列目录 性能优化方法和技巧这是一个可以用一本书来讲的话题,用一系列博客来讲,可能会比较单薄一点,这里只捡重要的说,忽略很多细节,当然以后还可以补充和扩展这个话题。 我以前就说过,性能优化有三个层次:
系统层次关注系统的控制流程和数据流程,优化主要考虑如何减少消息传递的个数;如何使系统的负载更加均衡;如何充分利用硬件的性能和设施;如何减少系统额外开销(比如上下文切换等)。 算法层次关注算法的选择(用更高效的算法替换现有算法,而不改变其接口);现有算法的优化(时间和空间的优化);并发和锁的优化(增加任务的并行性,减小锁的开销);数据结构的设计(比如lock-free的数据结构和算法)。 代码层次关注代码优化,主要是cache相关的优化(I-cache, D-cache相关的优化);代码执行顺序的调整;编译优化选项;语言相关的优化技巧等等。 性能优化需要相关的工具支持,这些工具包括编译器的支持;CPU的支持;以及集成到代码里面的测量工具等等。这些工具主要目的是测量代码的执行时间以及相关的cache miss, cache hit等数据,这些工具可以帮助开发者定位和分析问题。 性能优化和性能设计不同。性能设计贯穿于设计,编码,测试的整个环节,是产品生命周期的第一个阶段;而性能优化,通常是在现有系统和代码基础上所做的改进,属于产品生命周期的后续几个阶段(假设产品有多个生命周期)。性能优化不是重新设计,性能优化是以现有的产品和代码为基础的,而不是推倒重来。性能优化的方法和技巧可以指导性能设计,但两者的方法和技巧不能等同。两者关注的对象不同。性能设计是从正向考虑问题:如何设计出高效,高性能的系统;而性能优化是从反向考虑问题:在出现性能问题时,如何定位和优化性能。性能设计考验的是开发者正向建设的能力,而性能优化考验的是开发者反向修复的能力。两者可以互补。 后续我会就工具,架构,算法,代码,cache等方面展开讨论这个话题,敬请期待。 | |
雁过留声
“性能优化的方法和技巧:概述”有33个回复
期望你在写这个专题的时候。每个话题都在你想停笔的基础上再折腾一个晚上。 事情往往是再深一点,效果就不一样。
不要浅尝辄止。。。
不奢望写全,只希望针对某一点写透
想要把一个事情系统,完整的说清楚,除了实践外,还需要系统的思考,我会尽力把这个话题写透,当然,评论的启发也很重要。这里有很多高手,也可以指点,交流一下这个话题。
期待您的后续文章
优化不能缺少量化的信息,基于量化信息可以解决这些问题(举个例子):什么时候使用静态内存,什么时候使用动态内存? 动态与静态的分界线是什么?所谓和谐得恰到好处。
排队等!
最近因为工作需要也在做多核下的应用,这里面性能优化可能是最困难的地方了。个人觉得这方面作为知识分享的话,可以更加注重方法论的描述。优化本身是个仁者见仁智者见智的事情,优化的效果评估一方面取决于你的应用场景,另一方面也取决于你的测试方法。我们就曾为了优化算法而设计了一个数学上看起来很棒的hash,结果在早期应用中我们发现hash本身带来的cache miss,使得我们还不如使用linear search。总之是非常期待后续的文章,希望看到一些新的思路。
期待
这方面资料还是蛮多的,我也一直关注这块内容,ps,其实已经有一本书了,而且涵盖了上述的基本内容,从体系架构,到操作系统,到高级语言,就差算法
to will:能否提供一下该书的信息?
这个题目很大。值得期待。
to will:
是哪本书呀,给个书名,3x
要量化还是要有米的
占座,等====
to will:
难道这本书是深入理解计算机系统?
等答案。
系统层次 设计模式? 搬出前段时间的 “网络系统设计模式”基本所就可以应付了。
算法层次 应具体需求而定,可深可浅,太泛泛了等于没说,太细的话几本书都写不完。
至于代码 层面,无非数据结构对齐,cache线对齐,读/写域cache线分离,PerCPU统计/读写分CPU,延迟更新,缩减栈深度 … 这写东西,应该一篇论文的规模就能表达清楚吧?
期待ing。。。。
关于代码层次的优化,大多时候是把高级语言向低级语言去靠。然后就是将系统层次扁平化,厚的层做薄,薄的层去掉。很多时候philosophy的冲突导致实现困难。性能好了,移植性,维护性差了。老板还不高兴。我现在是越来越不想做这个活了。。。
同感,性能优化有时是个出力不讨好的工作,这个就看优化的效果如何了。优化和其他诸如可移植,可维护,可靠性等等是冲突的,而且优化有时只对某个特定的指标有效,写出来好看,但是实际用起来并不那么好用。所以这个活干起来不那么爽,不过可以学到很多东西。
没想到这么多人对这本书感兴趣,书名叫做An optimization guide for assembly programmers and compiler makers。大家可以去下载看看,内容还不错。
对于性能优化,我现在在做的事情就遇到这方面问题,高级语言有很多特性,导致性能上有很多代价,比如c++的virtual,导致很多小函数不可以被inline,call的代价打过函数体本身,虽然现在有些编译器提供devritual的功能,但是还是很初级。而很多C++的程序员却非常喜欢用virtual,有时候真的感觉无力呀。
贴一下这本书的链接:
http://www.agner.org/optimize/
原来是Buzz上Jike已经推荐过的,我也下过,但还没顾上看,-。-
内容比较多,可以挑感兴趣的看,写的还行
这本书的作者居然以VIA的Nano来作为案例,吃惊
性能优化是一个系统成熟过程的必经之路,有相当的含金量,多年前参与过一点
做性能优化,上要对系统/模块层次清楚,下要对高级语言代码与机器码,硬件结构的对应关系清楚。有一定经验的程序员,一次就能写出基本不用优化的代码。没经验的程序员,能把100条指令干完的活写出1000条开外。
现实往往是前者优化后者的代码,往往这个过程就是边优化边吐血骂娘,恨不得将其的代码重写一遍。最后技术问题变成了政治问题。干脆闭上双眼,承认这个不完美的世界,任其雨打风吹去。。。。。。
re kevin,我这段时间天天想骂娘
kernelchian,相当期待您的关于系统性能优化的一系列的讨论。不过有些方法和技巧只是停留在理论层面,就象你说的优化了可能还吃力不讨好,有些可能就非常实用了。
最简单的一个例子memcopy函数,如果优化得好,性能会提高相当多。我之前就碰到过这样的例子,不过不是我优化的,是intel的工程师做的。牛啊~!
按照我的理解,性能优化的之前必须要做的是先对系统的performance进行测试,找出bottlenecks,然后再有针对性的优化。比如linux系统上用profile工具,针对不同的处理器是不一样的。
不知道kernelchina在概述中提到的“工具”是不是就是这个意思?
同意,先做分析,找出瓶颈,然后针对性的优化。
俺碰到过一个例子,在freescale的powerpc上页表设置不合理,没有利用powerpc提供的bat,导致TLB miss过多。最后只改了几行,就解决了。
开始的时候,找不着头绪,尝试了那多很多方法,包括:修改总线访问周期设置、修改DRAM交错方式、不停修改代码、去掉冗余、修改数据结构优化cache利用率,都不管用。只有找到最瓶颈的那个地方,针对性的修改,才管用。
还有hugeTLB in Linux
在做设计阶段,就应该考虑性能的质量属性。
如果软件已经成型,再做系统级的性能优化,工作量、风险以及影响都较大。
代码级优化:先找热点,然后针对这些热点进行分析,cache使用、减少不必要指令数、减少栈的深度、提高IO总线利用(如IO由每次变成批量访问)、TLB Miss等等。性能是不能一次搞定的,需要建立基线,不停地迭代,不停地确认。
性能优化很容易降低软件的其他质量属性:如维护性、可扩展性。呵呵~~
“性能优化很容易降低软件的其他质量属性:如维护性、可扩展性。呵呵~~”
真是金玉良言啊!
我们优化了一个算法,结果市场跟客户说我们增加了内存,升级了CPU,投入了硬件成本,所以要加价。。。。