会员登录 | 会员注册 | 意见建议 | 网站地图

站长资源综合门户

当前位置:首页 > 站长学院 > 建站经验 > 性能调优攻略

性能调优攻略

时间:2012-06-21 18:30:55   作者:   来源:   点击:
纯属抛砖引玉。关于系统架构方面的性能调优,年夜家可移步看一下《由12306谈谈网站性能手艺》,关于Web方面的一些性能调优的东西,年夜家可以看看《Web开辟中需要体会的东西》一文中的性能一章。我在这里就不再说设计和架构上的东西了。

一般来讲,性能优化也就是下面的几个策略:

  • 用空间换时间。各类cache如CPU L1/L2/RAM到硬盘,都是用空间来换时间的策略。这样策略根基上是把计较的过程一步一步的保存或缓存下来,这样就不消每次用的时候都要再计较一遍,比如数据缓冲,CDN,等。这样的策略还表示为冗余数据,比如数据镜象,负载平衡什么的。
  • 用时间换空间。有时候,少量的空间可能性能会更好,比如网络传输,如果有一些压缩数据的算法(如前些天说的"Huffman 编码压缩算法" 和 "rsync 的核心算法"),这样的算法其实很耗时,可是因为瓶颈在网络传输,所以用时间来换空间反而能省时间。
  • 简化代码。最高效的法度就是不执行任何代码的法度,所以,代码越少性能就越高。关于代码级优化的手艺年夜学里的教科书有很多示例了。如:削减循环的层数,削减递归,在循环中少声明变量,少做分派和释放内存的操作,尽可能把循环体内的表达式抽到循环外,条件表达的中的多个条件判断的顺序,尽可能在法度启动时把一些东西准备好,注意函数挪用的开消(栈上开消),注意面向对象语言中姑且对象的开消,小心使用异常(不要用异常来查抄一些可接管可疏忽并常常产生的毛病),…… 等等,等等,这连东西需要我们很是体会编程语言和常常使用的库。
  • 并行措置。如果CPU只有一个核,你要玩多过程,多线程,对计较密集型的软件会反而更慢(因为操作系统调剂和切换开消很年夜),CPU的核多了才能真正体现出多过程多线程的优势。并行措置需要我们的法度有Scalability,不克不及水平或垂直扩大的法度无法进行并行措置。从架构上来讲,这表再为——是否可以做到不改代码只是加加机械便可以完成性能提升?

总之,按照2:8原则来讲,20%的代码耗了你80%的性能,找到那20%的代码,你便可以优化那80%的性能。 下面的一些东西都是我的一些经验,我只例举了一些最有价值的性能调优的的体例,供你参考,也欢迎弥补。

4.1)算法调优。算法很是重要,好的算法会有更好的性能。举几个我经历过的项目的例子,年夜家可以感触感染一下。

  • 一个是过滤算法,系统需要对收到的请求做过滤,我们把可以被filter in/out的东西配置在了一个文件中,原有的过滤算法是遍历过滤配置,后来,我们找到了一种体例可以对这个过滤配置进行排序,这样便可以用二分折半的体例来过滤,系统性能增加了50%。
  • 一个是哈希算法。计较哈希算法的函数其实不高效,一方面是计较太费时,另外一方面是碰撞太高,碰撞高了就跟单向链表一个性能(可参看Hash Collision DoS 问题)。我们知道,算法都是和需要措置的数据很有关系的,就算是被年夜家所嘲笑的"冒泡排序"在某些情况下(年夜大都数据是排好序的)其效率会高于所有的排序算法。哈希算法也一样,广为人知的哈希算法都是用英文字典做测试,可是我们的业务在数据有其特殊性,所以,对还需要按照自己的数据来挑选适合的哈希算法。对我以前的一个项目,公司内某牛人给我发来了一个哈希算法,成果让我们的系统性能上升了150%。(关于各类哈希算法,你一定要看看StackExchange上的这篇关于各类hash算法的文章 )
  • 分而治之和预措置。以前有一个法度为了生成月报表,每次都需要计较很长的时间,有时候需要花将近一整天的时间。于是我们把我们找到了一种体例可以把这个算法发成增量式的,也就是说我每天都把当天的数据计较好了后和前一天的报表归并,这样可以年夜年夜的节流计较时间,每天的数据计较劲只需要20分钟,可是如果我要算整个月的,系统则需要10个小时以上(SQL语句在年夜数据量面前性能成级数性下降)。这种分而治之的思路在年夜数据面前对性能有很帮忙,就像merge排序一样。SQL语句和数据库的性能优化也是这一策略,如:使用嵌套式的Select而不是笛卡尔积的Select,使用视图,等等。
分享到:

网友评论

热门建站经验