性能优化的方法和技巧.docxVIP

  • 7
  • 0
  • 约1.47万字
  • 约 18页
  • 2023-06-04 发布于天津
  • 举报
性能优化方法和技巧:概述 性能优化有三个层次: ?系统层次?算法层次?代码层次 系统层次关注系统的控制流程和数据流程,优化主要考虑如何减少消息传递的个数;如何使系统的负载更加均衡;如何充分利用硬件的性能和设施;如何减少系统额外开销(比如上下文切换等)。 算法层次关注算法的选择(用更高效的算法替换现有算法,而不改变其接口);现有算法的优化(时间和空间的优化);并发和锁的优化(增加任务的并行性,减小锁的开销);数据结构的设计(比如lock-free的数据结构和算法)。 代码层次关注代码优化,主要是cache相关的优化(I-cache,D-cache相关的优化);代码执行顺序的调整;编译优化选项;语言相关的优化技巧等等。 性能优化需要相关的工具支持,这些工具包括编译器的支持;CPU的支持;以及集成到代码里面的测量工具等等。这些工具主要目的是测量代码的执行时间以及相关的cachemiss,cachehit等数据,这些工具可以帮助开发者定位和分析问题。 性能优化和性能设计不同。性能设计贯穿于设计,编码,测试的整个环节,是产品生命周期的第一个阶段;而性能优化,通常是在现有系统和代码基础上所做的改进,属于产品生命周期的后续几个阶段(假设产品有多个生命周期)。性能优化不是重新设计,性能优化是以现有的产品和代码为基础的,而不是推倒重来。性能优化的方法和技巧可以指导性能设计,但两者的方法和技巧不能等同。两者关注的对象不同。性能设计是从正向考虑问题:如何设计出高效,高性能的系统;而性能优化是从反向考虑问题:在出现性能问题时,如何定位和优化性能。性能设计考验的是开发者正向建设的能力,而性能优化考验的是开发者反向修复的能力。两者可以互补。 后续我会就工具,架构,算法,代码,cache等方面展开讨论这个话题,敬请期待。 评论: 优化不能缺少量化的信息,基于量化信息可以解决这些问题(举个例子):什么时候使用静态内存,什么时候使用动态内存?动态与静态的分界线是什么?所谓和谐得恰到好处。 最近因为工作需要也在做多核下的应用,这里面性能优化可能是最困难的地方了。个人觉得这方面作为知识分享的话,可以更加注重方法论的描述。优化本身是个仁者见仁智者见智的事情,优化的效果评估一方面取决于你的应用场景,另一方面也取决于你的测试方法。我们就曾为了优化算法而设计了一个数学上看起来很棒的hash,结果在早期应用中我们发现hash本身带来的cachemiss,使得我们还不如使用linearsearch。总之是非常期待后续的文章,希望看到一些新的思路。 关于代码层次的优化,大多时候是把高级语言向低级语言去靠。然后就是将系统层次扁平化,厚的层做薄,薄的层去掉。很多时候philosophy的冲突导致实现困难。性能好了,移植性,维护性差了。老板还不高兴。我现在是越来越不想做这个活了。。。 在做设计阶段,就应该考虑性能的质量属性。如果软件已经成型,再做系统级的性能优化,工作量、风险以及影响都较大。 代码级优化:先找热点,然后针对这些热点进行分析,cache使用、减少不必要指令数、减少栈的深度、提高IO总线利用(如IO由每次变成批量访问)、TLBMiss等等。性能是不能一次搞定的,需要建立基线,不停地迭代,不停地确认。性能优化很容易降低软件的其他质量属性:如维护性、可扩展性。 性能优化方法和技巧:代码 代码层次的优化是最直接,也是最简单的,但前提是要对代码很熟悉,对系统很熟悉。很多事情做到后来,都是一句话:无他,但手熟尔* 在展开这个话题之前,有必要先简单介绍一下Cache相关的内容,如果对这部分内容不熟悉,建议先补补课,做性能优化对Cache不了解,基本上就是盲人骑瞎马。 Cache一般来说,需要关心以下几个方面 Cachehierarchy Cache的层次,一般有L1,L2,L3(L是level的意思)的cache。通常来说L1,L2是集成在CPU里面的(可以称之为On-chipcache),而L3是放在CPU外面(可以称之为Off-chipcache)。当然这个不是绝对的,不同CPU的做法可能会不太一样。这里面应该还需要加上register,虽然register不是cache,但是把数据放到register里面是能够提高性能的。 Cachesize Cache的容量决定了有多少代码和数据可以放到Cache里面,有了Cache才有了竞争,才有了替换,才有了优化的空间。如果一个程序的热点(hotspot)已经完全填充了整个Cache,那么再从Cache角度考虑优化就是白费力气了,巧妇难为无米之炊。我们优化程序的目标是把程序尽可能放到Cache里面,但是把程序写到能够占满整个Cache还是有一定难度的,这么大的一个Codepath,相应的代码得有多少,代码逻辑肯定是相当的复杂(基本上是不可

文档评论(0)

1亿VIP精品文档

相关文档