程序的性能衡量维度:
1.执行速度:程序反映是否迅速,响应时间是否合理
2.内存分配:内存是否合理,是否过多地消耗内存或者内存泄漏
3.启动时间:程序从运行到可以正常业务处理需要花费多长时间
4.负载承受能力:当系统压力上升的时候,系统的执行速度、响应时间的上升曲线是否平缓。
性能参考指标:
1.执行时间:一段代码从开始到运行结束,所用的时间,这也是我们最直观,最好测量的
2.CPU时间:函数或线程占用CPU的时间
3.内存分配:程序在运行时占用的内存空间
4.磁盘吞吐量:描述IO的使用情况
5.网络吞吐量:描述网络的使用情况,单位时间内上下行的流量大小
6.响应时间:系统对用户或者事件做出的响应时间。响应时间越短,性能越好
在性能调优方面一定要有针对性,根据木桶原理与性能瓶颈进行优化。最有可能出现性能瓶颈的有以下几个方面:
1.磁盘IO:因为磁盘IO读写数度比内存慢很多,所以程序如果需要等待IO,那么低效的IO会严重拖累系统
2.网络操作:因为网络的不稳定性,其对网络数据的读写情况也可能很慢。
3.CPU:如果应用对计算资源比较大,CPU可能会称为性能的瓶颈,像一些3D渲染,科学计算等。
4.异常:对于Java应用来说,异常的捕获和处理非常耗时。如果程序频繁进行异常处理,会大大降低程序性能
5.数据库:数据库在海量数据读写上可能会十分耗时,所以,合理设计数据库也很重要
6.锁竞争:对高并发应用来说,如果存在剧烈的锁竞争,会明显增加线程上下文切换的开销,会对性能造成极大的影响。
7.内存:程序设计不合理的时候,可能会导致内存不足,需要经常进行内存释放,内存释放的时候,应用常常需要停止,十分耗时。
性能调优的层次:(这里由重到轻的介绍,从对性能提升大的到小的)
1.设计调优:这是根本上决定程序性能的调优手段,一般在开始编写程序之前就要分析清楚系统可能存在的各种潜在问题,合理给出解决方案,或者规避这些问题。(如,根据业务场景选择合适的技术,合适的实现方案)
2.代码调优:这是在开发过程或者开发完之后对程序代码的改进和优化。如合理选择合适的数据结构,逻辑的实现方式,算法等。
3.JVM调优:针对写好的程序的运行情况,分析其内存,cpu在每一时刻的情况,合理的调整JVM的内存分区大小,垃圾回收策略,时间等。
4.数据库调优:对大部分应用来说,都会用上数据库,如何选择合适的数据库,设计好数据表,优化sql语句,选对合适的存储引擎等都会影响我们的数据库性能。
5.操作系统调优:在以上几个方面都完成后,就可以考虑在操作系统上是否有提升的空间。如何选择合适的操作系统:Linux版本,内核等,调整操作系统的同享内存等系统资源以跟我们的程序匹配上。
关于调优策略以及手段:
1.找到性能瓶颈:关键就是找到系统出现系统瓶颈的地方,有针对性的进行解决(一般使用一些性能分析工具,分析cpu,内存吞吐量等情况,测量运行速度来收集信息)
2.有明确的性能目标
3.测试:优化完成后要进行一个整体的测试,因为优化过程常常需要改写代码,这样能保证优化完的代码对已有的功能不造成影响