1.总是听说系统性能咋样,那我们为啥要性能调优?有啥意思?
1.1肺腑之言,唠叨几句感慨
以前写代码,一般都是跟着感觉走,业务实现出来就行了,至少客户端可以使用就可以。不管他三七二十一,总之我搞完了.......,三年了,慢慢的接触到系统中有些要求严格的客户,终于知道,系统仅仅做出来还是不够的,还需要去把他优化一下。早期理解的优化,就是代码的注释啊,减少不必要的变量和参数,减少代码量尽量简洁。没想到,系统性能调优还有很多方面可以去做,然而,三年的开发时间了,才明白这个重要性。茫茫大海,知识总是一点一滴积累的,每个人都为时不晚,那只是先知和后知的区别罢了......
1.2.为啥要性能调优?
(1)不经过性能调优和测试,不知道自己做的系统承受能力有多大,指不定哪天突然服务器就挂了。
(2)写的代码有死循环,或者有大量高并发的时候,代码中有复杂低效率的算法,这样cpu占用太高了,服务器可能吼不住,直到奔溃。
(3)性能不好,客户端或者用户页面等待时间很长,体验非常差。
(4)如果性能调优,使用两台服务器就可以轻松跑起来。结果因为性能差,给了四台服务器才能部署轻松跑起来。这个也是一种浪费资源啊。
1.3难不成写代码时候就要提心吊胆?什么时候去优化自己的代码?
(1)其实在开发初期,真的没法整体把握性能,只能在我们编码的过程中,使用一些高效率算法,降低锁的竞争,还需要尽量减少IO操作。只要注意这些地方,就可以了。
(2)一般项目完成了,进入测试阶段。这时候就是真正开始看性能的时候了。需要我们取进行各种测试和分析。
2.项目完成后,体现性能因素有哪些?
(1)CPU:有复杂的计算,或者有死循环,都会占用特别高的CPU,导致其他资源没办法争夺到cpu,就会特别慢。平时我们电脑也会卡,与这个也有关系。
(2)内存:Java通过jvm对内存进行分配管理。jvm通过堆内存存储java创建的对象。内存一般读取很快不会出现啥大问题。但是存储量有限。如果垃圾回收不及时,创建太多的对象,就会内存溢出泄露。
(3)磁盘IO:磁盘存储大,但是读取没有内存快。过多的操作IO,肯定会慢。
(4)网络:网络带宽,决定了数据相应时间。这个大家都知道。
(5)异常:异常抛出后居然会构建异常栈,这个过程非常消耗系统性。
(6)数据库:首先数据库数据量大的时候,读取涉及到磁盘IO读取。这时候也会有瓶颈。
(7)锁竞争:并发的时候,数据保持一致,比如一个线程在写库的时候,肯定是不允许其他线程修改这个数据。这时候就是用到了锁。也会增加系统的开销。
3.衡量性能的指标有哪几个?
(1)响应时间,肯定是响应时间越短越好,对吧?
主要是数据库时间,服务端时间,网络时间,客户端时间。每个环节都可能耗费时间。
(2)吞吐量:也就是单位时间内,你的系统能处理多少个事务。所以吞吐量越大越好,对吧?
吞吐量主要是磁盘IO吞吐量(每秒读写次数)和网络吞吐量(传输数据大小)。
(3)计算机资源分配使用率:比如cpu,内存,IO等,分配一定要合理。
(4)负载承受能力:并发量很大的时候,看看系统最大能承受多少。这个如果处理不好,可能导致奔溃。
4.总结一下上面说的
我们日常开发项目,前期编码过程中,就要注意算法,逻辑的高效,避免不必要的循环。避免少操作IO。等到系统编码完毕进入测试,就要去关注以上影响和衡量系统因素指标。看看那一块儿的问题。进行相应的优化。每次都要和上一次优化结果作比较。每次优化一定是有进步的。这些个人的整理,都是我简单的了解,可能有更深层次的东西我们还没有接触到,不要紧,慢慢去掌握,慢慢学。