版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA优化编程性能工程系列之三PQA测试部2010年5月职业要求优化原因o 为什么要进行优化?已经出现了问题为了防止出现问题优化目的o可供程序利用的资源(内存、CPU时间、网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务。o优化通常包含两方面的内容:o减小代码的体积;o提高代码的运行效率。o本文讨论的主要是如何提高代码的效率。优化目的o在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身。o养成好的代码编写习惯非常重要,比如正确地、巧妙地运用java.lang.String类和java.util.Vector类,它能够显著地提高程序的性能。o下
2、面我们就来具体地分析一下这方面的问题。优化抉择时间空间优化方法尽量重用对象优化第一招优化方法o特别是String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替。o由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。o因此,生成过多的对象将会给程序的性能带来很大的影响。优化方法尽量使用局部变量优化第二招优化方法o调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。o请参见尽可能使用堆
3、栈变量。优化方法不要重复初始化变量优化第三招优化方法o默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:o所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。o当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。优化方法务必释放不用资源优化第四招优化方法oJava 编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,即使关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致
4、严重的后果。oTry ocatch(Exception ex) ofinallyo优化方法o由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。oJVM回收垃圾的条件是:对象不再被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象使用完毕,应手动置成null。优化方法SQL语句尽量避免使用*优化第五招优化方法oORACLE在解析的过程中, 会将* 依次转换成所有的列名, 这个工作
5、是通过查询数据字典完成的, 这意味着将耗费更多的时间。o例如:oSELECT * FROM TABLE_NAMEo一般不推荐这种方式。优化方法尽量减少对变量的重复计算优化第六招优化方法o例如:for(int i = 0;i list.size; i +) ooo应替换为:ofor(int i = 0,int len = list.size();i len; i +) oo优化方法尽量采用lazy loading 的策略优化第七招优化方法o例如:oString str = “aaa”;nif(i = 1) olist.add(str);no应替换为:oif(i = 1) nString str
6、= “aaa”;nlist.add(str);o优化方法慎用异常优化第八招优化方法o异常对性能不利。抛出异常首先要创建一个新的对象。o只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。o 异常只能用于错误处理,不应该用来控制程序流程。优化方法巧用可变数组优化第九招oStringBuffer表示了可变的、可写的字符串。o有三个构造方法 :oStringBuffer (); /默认分配16个字符的空间oStringBuffer (int size); /分配size个字符的空间oStringBuffer (String str); /分配16个字符+str.length
7、()个字符空间 o你可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能。这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。o首先我们看看StringBuffer的缺省行为,然后再找出一条更好的提升性能的途径。oStringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始
8、化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来立竿见
9、影的性能增益。oStringBuffer初始化过程的调整的作用由此可见一斑。所以,使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议。优化方法巧用System.arraycopy优化第十招o当复制大量数据时,优先使用System.arraycopy()命令。优化方法增强代码的可读性优化第十一招优化方法o例如:opublic class ShopCart oprivate List carts ; public void add (Object item) oif(carts = null) ocarts = new ArrayList();o o crts.add(it
10、em);o 优化方法o public void remove(Object item) o if(carts. contains(item) o carts.remove(item);o o 优化方法opublic List getCarts() o/返回只读列表oreturn Collections.unmodifiableList(carts);oo/不推荐这种方式o/this.getCarts().add(item);o优化方法尽量减少数据库的连接、数据库的访问次数优化第十二招优化方法o创建数据库连接是最消耗系统资源的了。实际上,一个数据库连接在驱动和数据库服务器之间有多次网络往返,例如
11、,当某个驱动连接到Oracle或Sybase时,这个连接会有7到10和网络往返,执行了一系列的动作:o校验用户的身份证书o在数据库驱动期望的代码页设置和数据库可用的代码页设置之间进行协商(如果必要的话)o获取数据库版本信息o确定用于通信的最理想的数据库协议包大小o设置会话设置优化方法o使用连接池提高性能。o在条件允许的情况下牺牲部分内存避免频繁访问数据库带来的性能消耗。o例如:o代码表的实现。oSession的使用。优化方法array(数组) 和 ArryList的使用优化第十三招优化方法oarray():最高效;但是其容量固定且无法动态改变;ArrayList:容量可动态增长;但牺牲效率;o
12、基于效率和类型检验,应尽可能使用array,无法确定数组大小时才使用ArrayList!oArrayList是Array的复杂版本ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。oArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object,编译时不检查类型,但是运行时会报错。优化方法用charAt()代替startsWith()优化第十四招优化方法o用一个字符作为参数调用startsWit
13、h()也会工作的很好,但从性能角度上来看,调用用String API无疑是错误的! 例子:public class PCTS private void method(String s) if (s.startsWith(a) / violation / . 优化方法o更正 将startsWith() 替换成charAt().public class PCTS private void method(String s) if (a = s.charAt(0) / . 优化方法妙用条件操作符优化第十五招优化方法o条件操作符更加的简捷例子:public class IF public int met
14、hod(boolean isDone) if (isDone) return 0; else return 10; 优化方法o更正:public class IF public int method(boolean isDone) return (isDone ? 0 : 10); 优化方法o例子:public class IFAS void method(boolean isTrue) if (isTrue) _value = 0; else _value = 1; private int _value = 0;优化方法o更正:public class IFAS void method(bo
15、olean isTrue) _value = (isTrue ? 0 : 1); / compact expression. private int _value = 0;优化方法不要在循环体中实例化变量优化第十六招优化方法o在循环体中实例化临时变量将会增加内存消耗例子: import java.util.Vector;public class LOOP void method (Vector v) for (int i=0;i v.size();i+) Object o = new Object(); o = v.elementAt(i); 优化方法o更正: 在循环体外定义变量,并反复使用 import java.util.Vector;public class LOOP void method (Vector v) Object o; for (int i=0;iv.size();i+) o = v.elementAt(i); o不要在循环中使用oTry o catch() oo应把其放置在最外层。优化方法与一个接口与一个接口 进进行行instanceof操作操作优化第十七招优化方法o基于接口的设计通常是件好事,因为它允许有不同的实现,而又保持灵活。o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 下花园执业医师口腔医学测试卷
- 甘露醇使用中的护理团队建设
- 第一单元 身心特征教学设计-2025-2026学年初中地方、校本课程粤教版健康教育
- 阑尾炎病人护理专项考核试题
- 轮状病毒胃肠炎培训考核试题
- 心脏解剖试题及答案
- 乐理简答试题及答案
- 陕西省宝鸡市2026年高三高考模拟检测试题(三)(宝鸡三模)英语试卷(含答案)
- 2026年高职(生物制药技术)生物制药分离纯化综合测试题及答案
- 八年级历史与社会下册《第六单元 席卷全球的工业文明浪潮》教学设计(10份)人教版
- CCC认证CQC认证管理制度汇编
- YS/T 433-2016银精矿
- GB/T 6074-2006板式链、连接环和槽轮尺寸、测量力和抗拉强度
- 2022年天津市河西区中考数学一模试题及答案解析
- GA/T 1444-2017法庭科学笔迹检验样本提取规范
- 2022年大理白族自治州大理财政局系统事业单位招聘笔试试题及答案解析
- 诺和龙诺和龙在糖尿病心脑血管方面的作用专家讲座
- 阿片类药物中毒的急救处理课件
- 种业现状及发展思考课件
- 某大型化工集团公司导入WCM世界级制造策划资料课件
- DBJ∕T13-354-2021 既有房屋结构安全隐患排查技术标准
评论
0/150
提交评论