




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java程序优化颜色说明颜色说明*色*重点优化对象,必须遵守。* .黑色*能够提高性能,建议使用,但是不强制要求。避免在循环条件中使用复杂表达式在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而 使循环条件值不变的话,程序将会运行的更快。例子:import java.util.Vector;class CELvoid method(Vector vector)for ( int i = 0; i vector.size(); i+)/ Violation; 更正:class CEL_fixedvoid method (Vector vector)int size
2、= vector.size();for ( int i = 0; i 10, Vector n eeds to expa ndfor ( int i = 0; i o.length; i+)v .add(o); / capacity before it can add more eleme nts.public Vector v = new Vector。;/ no in itialCapacity.更正:自己设定初始大小。public Vector v = new Vector(20);public Hashtable hash = new Hashtable(IO);三、在finally块
3、中关闭数据库连接、I/O流操作,以释放资源程序中使用到的资源应当被释放,以避免资源泄漏。这最好在fin ally块中去做。不管程序执行的结果如何,fin ally块总是会执行的,以确保资源的正确关闭。例子:import java.io.*;public class CSpublicstaticvoid main (Stri ng args)CS cs =new CS();cs.method();publicvoidmethod()File In putStream fis = n ull;tryfis =new Filel nputStream(CS.java );int cou nt = 0
4、;while (fis.read() != -1)cou nt+;System.out.pri ntln( cou nt);catch(FileNotFou ndExcepti on e1)catch(IOExcepti on e2)fin allyfis.close();四、使用System.arraycopy ()代替通过来循环复制数组System.arraycopy ()要比通过循环来复制数组快的多。例子:public class IRB void method()intarray1 =newint100;for(int i = 0;i array1.len gtharray1=i;in
5、tarray2 =newint100;for(int i = 0;i array2.len gtharray2 = array1;/ Violation;i+);i+)更正:public class IRBvoid arrayl =new int 100;for ( int i = 0; i 2.intdiv2 = a / 8;/ should be replaced with a 3.inttemp = a / 3;更正:publicclass SDIVpublicstaticfinalint NUM= 16;publicvoid calculate(int a)int
6、div = a 2;intdiv2 = a 3;inttemp = a / 3;/不能转换成位移操作十、使用移位操作代替a * b同上。但我个人认为,除非是在一个非常大的循环内,性能非常重要,而且你很清楚你自己在做什么,方可使用这种方法。否则提高性能所带来的程序晚读性的降低将是不合算的。例子:publicclass SMULpublicvoid calculate(int a)intmul = a * 4;/ should be replaced with a 2.intmul2 = 8 * a;/ should be replaced with a 3.inttemp = a * 3;更正:
7、packageOPT;publicclass SMULpublicvoid calculate(int a)intmul = a 2;intmul2 = a 3;inttemp = a * 3;/不能转换-、在字符串相加的时候,使用 代替,如果该字符串只有一个字符的话例子:public class STR public void method(String s) String string = s + d/ violation.string = abc + d/ violation.更正:将一个字符的字符串替换成public class STR public void method(Strin
8、g s) String string = s + dstring = abc + d十二、不要在循环中调用synchronized(同步)方法方法的同步需要消耗相当大的资料,在一个循环中调用它绝对不是一个好主意。例子:import java.util.Vector;public class SYN publicsyn chro ni zedvoid method(Object o)privatevoidtest()for(inti = 0; i vector .size(); i+)method(vector.eleme ntAt(i);/ violati onprivate Vector v
9、ectornew Vector(5, 5);更正:不要在循环体中调用同步方法,如果必须同步的话,推荐以下方式:import java.util.Vector;public class SYNpublic void method(Object o)private void test ()syn chr oni zed/在一个同步块中执行非同步方法for ( int i = 0; i vector.size(); i+)method (vector.eleme ntAt(i);private Vector vector = new Vector(5, 5);十三、 将try/catch块移出循环把
10、try/catch块放入循环体内,会极大的影响性能,如果编译JIT被关闭或者你所使用的是个不带JIT的JVM,性能会将下降21%之多!例子:importjava.io.FileI nputStream;publicclass TRYvoidmethod(FilelnputStream fis)for (int i = 0; i size; i+)try/ violatio n_sum += fis.read();catch(Excepti on e)private int _sum ;更正:将try/catch块移出循环void method (FileI nputStream fis)try
11、for (int i = 0; i size; i+)_sum += fis.read();catch(Excepti on e)十四、 对于boolean值,避免不必要的等式判断将一个boolean值与一个true比较是一个恒等操作(直接返回该boolean变量的值).移走对于 boolean的不必要操作至少会带来2个好处:1)代码执行的更快(生成的字节码少了5个字节);2)代码也会更加干净。例子:public class UEQboolean method (String string)return string.endsWith (a) = true;/ Violation更正:clas
12、s UEQ_fixedboolean method (String string)return string.endsWith (a);十五、对于常量字符串,用String代替StringBuffer常量字符串并不需要动态改变长度。例子:public class USCString method ()StringBuffer s = new StringBuffer (Hello);String t = s + World!;return t;更正: 把StringBuffer换成String,如果确定这个 String不会再变的话,这将会减少运行开销提高 性能。十六、 用StringToke
13、nizer 代替 indexOf() 和substring。字符串的分析在很多应用中都是常见的。使用indexOf()和substring()来分析字符串容易导致 StringlndexOutOfBoundsException。而使用 StringTokenizer 类来分析字符串则会容易一些, 效率也会高一些。例子:public class USTvoid parseString(String string)int in dex = 0;while(i ndex = str in g.i ndexOf(. , in dex) != -1)System.out .println(string.
14、substring(index,str in g.le ngth();十七、 不要在循环体中实例化变量在循环体中实例化临时变量将会增加内存消耗例子:import java.util.Vector;public class LOOPvoid method(Vector v)for (int i = 0; i v.size(); i+)Object o =new Object();o = v.eleme ntAt(i);更正:在循环体外定义变量,并反复使用import java.util.Vector;public class LOOPvoid method(Vector v)Object o;f
15、or ( int i = 0; i v.size(); i+) o = v.eleme ntAt(i);十八、 确定StringBuffer的容量StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这 个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,你可以在创建StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。例子:public class RSBCvoid method()Stri ngBuffer buffer =new Stri ngBuffer();/
16、 violati onbuffer.appe nd(hello );更正:为StringBuffer提供大小。publicclass RSBCvoid method()Stri ngBuffer buffer =new Stri ngBuffer(MAX);buffer.appe nd(hello);privatefinalintMAX = 100;十九、 尽可能的使用栈变量如果一个变量需要经常访问,那么你就需要考虑这个变量的作用域了。static? local?还是实例变量?访问静态变量和实例变量将会比访问局部变量多耗费2-3个时钟周期。例子:public class USVvoid get
17、Sum( int values)for (int i = 0; i value .len gth; i+)_sum += value; / violati on.void getSum2( int values)for (int i = 0; i value .len gth; i+)_staticSum += value;privateint_sum ;privatestatic int_staticSum ;更正: 如果可能,请使用局部变量作为你经常访问的变量。你可以按下面的方法来修改getSum()方法:void getSum ( int values)int sum = _sum;/
18、temporary local variable.for ( int i=0; i value.length; i+)sum += value;_sum = sum;二十、不要总是使用取反操作符 取反操作符 降低程序的可读性,所以不要总是使用。例子:public class testboolea n method( boolea n a, boolea n b)if (!a)return !a;elsereturn !b;更正:如果可能不要使用取反操作符与一个接口进行 instanceof 操作基于接口的设计通常是件好事,因为它允许有不同的实现,而又保持灵活。只要可能,对一 个对象进行inst
19、anceof操作,以判断它是否某一接口要比是否某一个类要快。例子:public class INSOF private void method (Object o) if (o instanceof InterfaceBase) / betterif (o instanceof ClassBase) / worse.class ClassBase interface InterfaceBase 二十二、异常对性能不利抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为filllnStackTrace()的本地(Native)方法,filllnStackTrace()方法检查
20、堆栈,收集调用跟踪信息。只要有异常被 抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。二十三、不用new关键词创建类的实例用new关键词创建类的实例时, 构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了 Cloneable接口,我们可以调用它的 clone()方法。clone()方法不会调用任何 类构造函数。在使用设计模式(Design Pattern )的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:public static
21、 Credit getNewCredit() return new Credit();改进后的代码使用clone()方法,如下所示:private static Credit BaseCredit = new Credit(); public static Credit getNewCredit() return (Credit) BaseCredit.clone();二十四、尽量使用局部变量调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack )中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap )中创建,速度较慢。二十五、避免对象创建和GC只要有可能,应该避免
22、创建对象,防止调用构造函数带来的相关性能成本,以及在对象结束其生命周期时进行垃圾收集所带来的成本。考虑以下这些准则:?只要有可能,就使用基本变量类型,而不使用对象类型。例如,使用int,而不使用Integer ;?缓存那些频繁使用的寿命短的对象,避免一遍又一遍地重复创建相同的对象,并因此加重垃圾收集的负担;?在处理字符串时,使用StringBufer而不使用字符串String进行连接操作,因为字 符串对象具有不可变的特性,并且需要创建额外的字符串对象以完成相应的操作, 而这些对象最终必须经历GC ;?避免过度地进行 Java控制台的写操作,降低字符串对象处理、文本格式化和输出 带来的成本;?实
23、现数据库连接池,重用连接对象,而不是重复地打开和关闭连接;?使用线程池(thread pooling ),避免不停地创建和删除线程对象,特别是在大量使用线程的时候;?避免在代码中调用 GC。GC是一个停止所有处理(stop the world )的事件,它意味着除了 GC线程自身外,其他所有执行线程都将处于挂起状态。如果必须调用GC,那么可以在非紧急阶段或空闲阶段实现它;?避免在循环内分配对象。?尽早释放无用对象的引用。大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope )后,自动设置为 null。我们在使用这种方式时候,必须特别注意一些复杂的对象,例如数组,队列,树,图
24、等,这些对象之间的相互引用关系较为复杂。对于这类对象,GC回收它们一般效率较低。如果程序允许,尽早将不再使用的引用对象赋为 null。这样可以加速 GC的工作。?如果有经常使用的图片,可以使用soft引用类型。它可以尽可能将图片保存在内存中,供程序调用,而不引起Out Of Memory 。?注意一些全局的变量,以及一些静态变量。这些变量往往容易引起悬挂对象(da ngli ng reference ),造成内存浪费。?使用 Stringa = a;定义字符串,而不是使用Stringa = new String( a);二十六、避免非常大的分配有时候问题不是由当时的堆状态造成的,而是因为分配失
25、败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。这不仅仅是Java的问题,使用C中的malloc也会遇到这个问题。JVM在压缩阶段通过重新分配引用来减少碎片, 但其代价是要冻结应用程序较长的时间。二十七、SQL语句大写在JAVA + ORACLE的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式, 以减轻ORACLE解析器的解析负担。二十八、尽量重用对象,特别是String对象的使用中,出现字符串连接情况时应用StringBuffer代替由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的
26、性能带来很大的影响;例子:StringBuffer sqlbuff = new StringBuffer();sqlbuff.append(” select to_char(decode(parent_item_id ,(select parent_item_id froms_finance_item_2009 where item_id=10),null,parent_item_id) up_id,+to_char(item_id) id,item_name name );sqlbuff.append( from s_finance_item_2009 start with item_id=10 connect byparent_item_id= prior itemd );二十九、由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露;JVM的GC并非十分的机智,即所以,建议我们在对象使用完毕,JVM回收垃圾的条件是:对象不在被引用;然而, 使对象满足了垃圾回收的条件也不一定会被立即回收。 应手动置成null ;示例代码:Object rvo =ArrayList tlist =new Object2;new ArrayList();tlist = BOQue
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国水产养殖市场发展规模与投资战略研究报告
- 2025-2030年中国毛纺织加工行业运营状况及发展前景分析报告
- 2025-2030年中国木材保护市场发展趋势规划研究报告
- 2025-2030年中国无线电遥测设备行业十三五规划及发展前景分析报告
- 2025-2030年中国彩色网络摄像机市场运行动态及前景趋势预测报告
- 2025-2030年中国工业清洁设备行业市场运行现状及发展可行性分析报告
- 2025-2030年中国医学影像设备市场运行现状及发展趋势预测报告
- 2025-2030年中国二丙二醇行业运行动态及前景趋势预测报告
- 2025-2030年中国中转运输行业市场运行趋势及投资战略研究报告
- 机床采购合同
- 2024-2025学年山东省烟台市高三上学期期末学业水平考试英语试题(解析版)
- 2025年益阳医学高等专科学校高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 配套课件-前厅客房服务与管理
- 2025年度药店营业员服务规范及合同约束协议3篇
- 工业和信息化部装备工业发展中心2025年上半年应届毕业生招聘易考易错模拟试题(共500题)试卷后附参考答案
- 重庆市2024-2025学年高一上学期期末联考生物试卷(含答案)
- 紧急疏散逃生方法
- 羊水栓塞护理应急预案
- 2024年医师定期考核临床类考试题库及答案(共500题)
- 工程进度款支付台账-1-
- 沥青路面施工质量控制要78课件讲解
评论
0/150
提交评论