大家看看,我觉得写的挺好。
关于性能优化这是一个比较大的话题,在《 》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法。本文的东西是我的一些经验和知识,并不一定全对,希望大家指正和补充。
在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的《 》,这篇文章基本上告诉你——要进行优化,先得找到性能瓶颈! 但是在讲如何定位系统性能瓶劲之前,请让我讲一下系统性能的定义和测试,因为没有这两件事,后面的定位和优化无从谈起。
让我们先来说说如何什么是系统性能。这个定义非常关键,如果我们不清楚什么是系统性能,那么我们将无法定位之。我见过很多朋友会觉得这很容易,但是 仔细一问,其实他们并没有一个比较系统的方法,所以,在这里我想告诉大家如何系统地来定位性能。 总体来说,系统性能就是两个事:
一般来说,一个系统的性能受到这两个条件的约束,缺一不可。比如,我的系统可以顶得住一百万的并发,但是系统的延迟是2 分钟以上,那么,这个一百万 的负载毫无意义。系统延迟很短,但是吞吐量很低,同样没有意义。所以,一个好的系统的性能测试必然受到这两个条件的同时作用。 有经验的朋友一定知道,这两个东西的一些关系:
经过上述的说明,我们知道要测试系统的性能,需要我们收集系统的Throughput 和Latency 这两个值。
性能测试有很多很复要的东西,比如:burst test 等。 这里不能一一详述,这里只说了一些和性能调优相关的东西。总之,性能测试是一细活和累活。
有了上面的铺垫,我们就可以测试到到系统的性能了,再调优之前,我们先来说说如何找到性能的瓶颈。我见过很多朋友会觉得这很容易,但是仔细一问,其实他们并没有一个比较系统的方法。
首先,当我们系统有问题的时候,我们不要急于去调查我们代码,这个毫无意义。我们首要需要看的是操作系统的报告。看看操作系统的CPU 利用率,看看 内存使用率,看看操作系统的IO ,还有网络的IO ,网络链接数,等等。Windows 下的perfmon 是一个很不错的工具,Linux 下也有很多相关的 命令和工具,比如: , ,vmstat, sar, iostat, top, tcpdump 等等 。通过观察这些数据,我们就可以知道我们的软件的性能基本上出在哪里。比如:
上不去了,这说明我们的程序并没有忙于计算,而是忙 于别的一些事,比如IO 。(另外,CPU 的利用率还要看内核态的和用户态的,内核态的一上去了,整个系统的性能就下来了。而对于多核CPU 来说,CPU 0 是相当关键的,如果CPU 0 的负载高,那么会影响其它核的性能,因为CPU 各核间是需要有调度的,这靠CPU0 完成)
2 )然后,我们可以看一下IO 大不大,IO 和CPU 一般是反着来的,CPU 利用率高则IO 不大,IO 大则CPU 就小。关于IO ,我们要看三个事,一个是磁盘文件IO ,一个是驱动程序的IO (如:网卡),一个是内存换页率。这三个事都会影响系统性能。
4 )如果CPU 不高,IO 不高,内存使用不高,网络带宽使用不高。但是系统的性能上不去。这说明你的程序有问题,比如,你的程序被阻塞了。可能是因为等那个锁,可能是因为等某个资源,或者是在切换上下文。
通过了解操作系统的性能,我们才知道性能的问题,比如:带宽不够,内存不够,TCP 缓冲区不够,等等,很多时候,不需要调整程序的,只需要调整一下硬件或操作系统的配置就可以了。
的微指令级别,如果你关心CPU 的L1/L2 的缓存调优,那么你需要考虑一下使用 VTune 。 使用这些Profiler 工具,可以让你程序中各个模块函数甚至指令的很多东西,如:运行的时间 ,调用的次数,CPU 的利用率,等等。这些东西对我们来 说非常有用。
我们重点观察运行时间最多,调用次数最多的那些函数和指令。这里注意一下,对于调用次数多但是时间很短的函数,你可能只需要轻微优化一下,你的性能就上去了(比如:某函数一秒种被调用100 万次,你想想如果你让这个函数提高0.01 毫秒的时间 ,这会给你带来多大的性能)
使用Profiler 有个问题我们需要注意一下,因为Profiler 会让你的程序运行的性能变低,像PurifyPlus 这样的工具会在你的代码 中插入很多代码,会导致你的程序运行效率变低,从而没发测试出在高吞吐量下的系统的性能,对此,一般有两个方法来定位系统瓶颈:
1 )在你的代码中自己做统计,使用微秒级的计时器和函数调用计算器,每隔10 秒把统计log 到文件中。
2 )分段注释你的代码块,让一些函数空转,做Hard Code 的Mock ,然后再测试一下系统的Throughput 和Latency 是否有质的变化,如果有,那么被注释的函数就是性能瓶颈,再在这个函数体内注释代码,直到找到最耗性能的语句。
最后再说一点,对于性能测试,不同的Throughput 会出现不同的测试结果,不同的测试数据也会有不同的测试结果。所以,用于性能测试的数据非常重要,性能测试中,我们需要观测试不同Throughput 的结果。
下面这些东西是我所经历过的一些问题,也许并不全,也许并不对,大家可以补充指正,我纯属抛砖引玉。关于系统架构方面的性能调优,大家可移步看一下《 》,关于Web 方面的一些性能调优的东西,大家可以看看《 》一文中的性能一章。我在这里就不再说设计和架构上的东西了。
一般来说,性能优化也就是下面的几个策略:
总之,根据2 :8 原则来说,20% 的代码耗了你80% 的性能,找到那20% 的代码,你就可以优化那80% 的性能。 下面的一些东西都是我的一些经验,我只例举了一些最有价值的性能调优的的方法,供你参考,也欢迎补充。
4.1 )算法调优。算法非常重要,好的算法会有更好的性能。举几个我经历过的项目的例子,大家可以感觉一下。
4.2 )代码调优。从我的经验上来说,代码上的调优有下面这几点:
之类的,如果我们的程序是同步操作,那么会非常影响性能,我们可以改成 异步的,但是改成异步的方式会让你的程序变复杂。异步方式一般要通过队列,要注间队列的性能问题,另外,异步下的状态通知通常是个问题,比如消息事件通知 方式,有 callback 方式,等,这些方式同样可能会影响你的性能。但是通常来说,异步操作会让性能的吞吐率有很大提升( Throughput ),但是 会牺牲系统的响应时间( latency )。这需要业务上支持
对于汽车爱好者来讲,尤其是男性朋友,都渴望拥有一台SUV。正是由于这个原因,成就了SUV市场异常火爆局面。年,我国SUV占乘用车销量的比重呈上升趋势。2013年,SUV销量占乘用车的比重为16.67%,较上年提高了3.76个百分点;2014年,SUV销量占乘用车销量接近20%。除了传统上的中型SUV,中大型SUV近两年来呈现出了蓬勃的发展趋势。随着汽车消费水平的不断升级,人们不再满足传统的中型城市SUV了,消费者开始注意到中大型SUV的家庭用途了,尤其是相对富裕的阶层。
根据已购买该款车的车主在操控性方面的评价,对一辆车进行评分。然后再选取该款车500名以上的车主的评价,取其平均值,作为该款车的一个最后的得分。对我国中大型SUV汽车市场国外品牌和自主品牌的20余款中大型SUV进行评价并排序,最后排出了中大型SUV在操控性方面得分最高的前十位。
其中前五位的依次为宝马X5、宝马X6、英菲尼迪QX70、路虎揽胜运动版和保时捷卡宴。排名第六至十位的依次为三菱帕杰罗(进口)、讴歌MDX、福特探险者、大众途锐和奔驰M级。从排名来看,宝马X5和X6两款车排名第一和第二,也印证了开车开宝马的俗话。以上排名基础数据来源于前瞻指南研究院汽车行业数据库。