版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、山水瑞通网络科技有限责任公司山水瑞通网络科技有限责任公司优化循环体优化循环体循环是比较重复运行的地方,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。让我们看看下面的代码片:.Vector vect = new Vector(1000);.for( inti=0; ivect.size(); i+).for循环部分改写成:循环部分改写成:int size = vect.size(); for( int i=0; i size; i+).如果size=1000,就可以减少1000次size()的系统调用开销,避免了循环体重复调用。少用少用newnew初始化一个实例初始化一个
2、实例尽量少用new来初始化一个类的实例,当一个对象是用new进行初始化时,其构造函数链的所有构造函数都被调用到,所以new操作符是很消耗系统资源的,new一个对象耗时往往是局部变量赋值耗时的上千倍。同时,当生成对象后,系统还要花时间进行垃圾回收和处理。当new创建对象不可避免时,注意避免多次的使用new初始化一个对象。尽量在使用时再创建该对象。如:NewObject object = new NewObject();int value;if(i0 )value =object.getValue();少用少用newnew初始化一个实例初始化一个实例上面一段代码可以修改为:上面一段代码可以修改为:
3、int value;if(i0 )NewObject object = new NewObject();Value =object.getValue();另外,应该尽量重复使用一个对象,而不是声明新的同类对象。一个重用对象的方法是改变对象的值,如可以通过setValue之类的方法改变对象的变量达到重用的目的。 在Java中,一切都是对象,如果有方法(Method)调用,处理器先要检查该方法是属于哪个对象,该对象是否有效,对象属于什么类型,然后选择合适的方法并调用。 可以减少方法的调用,同样一个方法:public void CallMethod(int i )if( i =0 )return;.
4、 / 其他处理其他处理如果直接调用如果直接调用int i = 0;.CallMethod(i);选择合适的方法调用选择合适的方法调用选择合适的方法调用选择合适的方法调用上面的代码,就应该写成:int i = 0;.if( i =0 )CallMethod(i);不影响可读性等情况下,可以把几个小的方法合成一个大的方法。另外,在方法前加上final,private关键字有利于编译器的优化。 尽量使用局部变量尽量使用局部变量 n调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的
5、编译器/JVM,局部变量还可能得到进一步优化。 尽量使用局部变量尽量使用局部变量 例子:public class USV private int _sum; private static int _staticSum; void getSum (int values) for (int i=0; i values.length; i+) _sum += valuesi; / violation. void getSum2 (int values) for (int i=0; i values.length; i+) _staticSum += valuesi; 更正: 如果可能,请使用局部变量
6、作为你经常访问的变量。你可以按下面的方法来修改getSum()方法: void getSum (int values) int sum = _sum; / temporary local variable. for (int i=0; i values.length; i+) sum += valuesi; _sum = sum; 1、字符串在JAVA中被广泛的使用,但是由于String 对象是不可改变的, 所以如果我们试图将两个String对象相加的时候,它实际的执行是产生一个中间对象StringBuffer,并调用它的append ()法来进行相加的,最后调用StringBufffer的t
7、oString()方法来返回一个String的对象,如果只是一般的相加差别不大,但是如果是在循环中,性能差距就较明显注:String s = “a” + “b” + “c”,实际上在编译后是String s=“abc”,执行时不存在相加问题 2、在字符串相加的时候,如果该字符串只有一个字符的话 如:String str = s + “d”应该换作 string = s + d来执行。3、由于在创建一个StringBuffer对象时, StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过
8、来,再丢弃旧的数组。在大多数情况下,如果可以的话 ,在创建StringBuffer的时候应指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。返回返回尽可能的使用尽可能的使用JavaJava自身提供的自身提供的APIAPI上面那段代码,如果使用Java提供的API,就可以提高性能:例子:npublic class IRBnn void method () n int array1 = new int 100;n for (int i = 0; i array1.length; i+) n array1 i = i;n n int array2 = new int 100;n for (
9、int i = 0; i array2.length; i+) n array2 i = array1 i; / Violationn n n同样的一个规则是,当有大量数据的复制时,应该使用System.arraycopy()。 尽可能的使用尽可能的使用JavaJava自身提供的自身提供的APIAPI 更正:npublic class IRBnn void method () n int array1 = new int 100;n for (int i = 0; i array1.length; i+) n array1 i = i;n n int array2 = new int 100;
10、n System.arraycopy(array1, 0, array2, 0, 100);n n不要重复初始化变量不要重复初始化变量 n默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。避免不需要的造型操作避免不需要的造型操作 n所有的类都是直接或者间接继承自Object。同样,所有的子类也都隐含的“等
11、于”其父类。那么,由子类造型至父类的操作就是不必要的了。n例子:nclass UNC n String _id = UNC;nnclass Dog extends UNC n void method () n Dog dog = new Dog ();n UNC animal = (UNC)dog; / not necessary.n Object o = (Object)dog; / not necessary.n nn n更正: nclass Dog extends UNC n void method () n Dog dog = new Dog();n UNC animal = dog;
12、n Object o = dog;n n如果只是查找单个字符的话,用如果只是查找单个字符的话,用charAt()代替代替startsWith() n用一个字符作为参数调用startsWith()也会工作的很好,但从性能角度上来看,调用String API无疑是错误的!n n例子:npublic class PCTS n private void method(String s) n if (s.startsWith(a) / violationn / .n n nn n更正 n将startsWith() 替换成charAt().npublic class PCTS n private void
13、 method(String s) n if (a = s.charAt(0) n / .n n n不要在循环中调用不要在循环中调用synchronized(同步同步)方法方法 n方法的同步需要消耗相当大的资源,在一个循环中调用它绝对不是一个好主意。n例子:nimport java.util.Vector;npublic class SYN n public synchronized void method (Object o) n n private void test () n for (int i = 0; i vector.size(); i+) n method (vector.el
14、ementAt(i); / violationn n n private Vector vector = new Vector (5, 5);n不要在循环中调用不要在循环中调用synchronized(同步同步)方法方法 n更正:n不要在循环体中调用同步方法,如果必须同步的话,推荐以下方式:nimport java.util.Vector;npublic class SYN n public void method (Object o) n nprivate void test () n synchronized/在一个同步块中执行非同步方法n for (int i = 0; i vector
15、.size(); i+) n method (vector.elementAt(i); n n n n private Vector vector = new Vector (5, 5);noracle的的SQL语句尽量使用大写语句尽量使用大写 n在在JAVA + ORACLE 的应用系统开发中,的应用系统开发中,java中内嵌的中内嵌的SQL语句语句尽量使用大写的形式,以减轻尽量使用大写的形式,以减轻ORACLE解析器的解析负担。解析器的解析负担。 减少减少I/OI/O操作操作尽量减少尽量减少I/OI/O操作:操作: 输入/输出(I/O)包括很多方面,我们知道,进行I/O操作是很消耗系统资源
16、的。程序中应该尽量少用I/O操作。使用时可以注意: . 合理控制输出函数System.out.println()对于大多时候是有用的,特别是系统调试的时候,但也会产生大量的信息出现在控制台和日志上,同时输出时,有序列化和同步的过程,造成了开销。特别是在发行版中,要合理的控制输出,可以在项目开发时,设计好一个Debug的工具类,在该类中可以实现输出开关,输出的级别,根据不同的情况进行不同的输出的控制。尽量使用缓存:尽量使用缓存:读写内存要比读写硬盘上的文件要快很多,应尽可能使用缓冲,以便直接从内存中读取数据。尽可能使用带有Buffer的类代替没有Buffer的类,如可以用BufferedRead
17、er 代替Reader,用BufferedWriter代替Writer来进行处理I/O操作。同样可以用BufferedInputStream代替InputStream都可以获得性能的提高 即时关闭I/O流操作 n Java 编程过程中,I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致严重的后果。在在finally块中关闭块中关闭Streamn程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。n例子:nimport java.
18、io.*;npublic class CS n public static void main (String args) n CS cs = new CS ();n cs.method ();n n public void method () n try n FileInputStream fis = new FileInputStream (CS.java);n int count = 0;n while (fis.read () != -1)n count+;n System.out.println (count);n fis.close ();n catch (FileNotFound
19、Exception e1) n catch (IOException e2) n n nn 更正:n在最后一个catch后添加一个finally块对象使用完毕应手动置成null n由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象使用完毕,应手动置成null。 尽量采用尽量采用lazy load
20、ing 的策略的策略 n 例如: String str = “aaa”; n if(i = 1) list.add(str);n 应替换为: if(i = 1) String str = “aaa”; list.add(str); 慎用异常慎用异常 n异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。 不
21、要在循环中使用不要在循环中使用 try catchnTry catch() 应把其放置在最外层。 集合类在此Java编程中被广泛地使用,一个集合类就是将一组对象组装成一个对象Java的集合类框架由一些接口(如Collection、List、Set、Map)和一些为通用目的而实现的类(如Vector,ArrayList、Hashtable等等)组成,这些类里,有些提供了某种排序算法,有的提供了同步的方法,有如此多的集合类,在具体使用过程中,我们如何根据自己的需要选择合适的集合类,将对程序的性能产生很大的影响,下面将一些常用的类进行比较:Vector和和ArrayList Vector和Array
22、List在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。它们的区别如下: 1、Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好.2、当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样ArrayList就有利于节约内存空间。Hashtable和和HashMap 它们的性能方面的比较类似 Vector和ArrayLi
23、st,比如Hashtable的方法是同步的,而HashMap的不是。 当它们中的元素超过它的初始大小时,都会将它的容量翻倍。ArrayListArrayList和和LinkedList LinkedList 对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object,所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。 (1)在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以
24、,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能。 (2)访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。 注意:在Java集合框架中的大部分类的大小是可以随着元素个数的增加而相应的增加的,我们似乎不用关心它的初始大小,但如果我们考虑类的性能问题时,就一定要考虑尽可能地设置好集合对象的初始大小,这将大大提高代码的性能,比如,Hashtabl
25、e缺省的初始大小为11,载入因子为0.75,即如果其中的元素个数超过7个,它就必须增加大小并重新组织元素,所以,如果你知道在创建一个新的Hashtable对象时就知道元素的确切数目如为12,那么,就应将其初始大小设为12/0.75=16,这样,就可以避免重新组织内存并增加大小。(默认Vector ArrayList 10个大小,Hashtable 11,HashMap 16)返回不用保存太多的信息在不用保存太多的信息在HttpSession中中很多时候,存储一些对象在HttpSession中是有必要的,可以加快系统的开发,如网上商店系统会把购物车信息保存在该用户的Session中,但当存储大量
26、的信息或是大的对象在会话中时,是有害的,特别是当系统中用户的访问量很大,对内存的需求就会很高。不用保存太多的信息在不用保存太多的信息在HttpSession中中清除清除SESSIONSESSION:通常情况,当达到设定的超时时间时,同时有些Session没有了活动,服务器会释放这些没有活动的Session,. 不过这种情况下,特别是多用户并访时,系统内存要维护多个的无效Session。当用户退出时,应该手动释放,回收资源,实现如下:HttpSession theSession = request.getSession();/ 获取当前Sessionif(theSession != null)t
27、heSession.invalidate(); / 使该Session失效在JSP页面中关闭无用的会话n一个常见的误解是以为session在有客户端访问时就被创建,然 而 事 实 是 直 到 某 s e r v e r 端 程 序 调 用HttpServletRequest.getSession(true)这样的语句时才被创建 , 注 意 如 果 J S P 没 有 显 示 的 使 用 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中
28、隐含的session对象的来历。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。对于那些无需跟踪会话状态的页面,关闭自动创建的会话可以节省一些资源。使用如下page指令: 使用快速度的使用快速度的JdbcJdbc驱动驱动JDBC API包括两种实现接口形式,一种是纯Java实现的驱动,一种利用ODBC驱动和数据库客户端实现,具体有四种驱动模式: 第一类JDBC驱动程序是JDBC-ODBC桥再加上一个ODBC驱动程序。建议第一类驱动程序只用于原型开发,而不要用于正式的运行环境。桥接驱动程序由Sun提供,它的目标是支持传统的数据库系统。Sun为该软
29、件提供关键问题的补丁,但不为该软件的最终用户提供支持。一般地,桥接驱动程序用于已经在ODBC技术上投资的情形,例如已经投资了Windows应用服务器。 尽管Sun提供了JDBC-ODBC桥接驱动程序,但由于ODBC会在客户端装载二进制代码和数据库客户端代码,这种技术不适用于高事务性的环境。另外,第一类JDBC驱动程序不支持完整的Java命令集,而是局限于ODBC驱动程序的功能,这种驱动方式也叫胖客户,主要用于低并发请求,大数据量传输的应用。使用快速度的使用快速度的JdbcJdbc驱动驱动 第二类JDBC驱动程序是本机API的部分Java代码的驱动程序,用于把JDBC调用转换成主流数据库API的
30、本机调用。这类驱动程序也存在与第一类驱动程序一样的性能问题,即客户端载入二进制代码的问题,而且它们被绑定了特定的平台。 第二类驱动程序要求编写面向特定平台的代码,主流的数据库厂商,例如Oracle和IBM,都为它们的企业数据库平台提供了第二类驱动程序,使用这些驱动程序的开发者必须及时跟进不同数据库厂商针对不同操作系统发行的各个驱动程序版本。 另外,由于第二类驱动程序没有使用纯Java的API,把Java应用连接到数据源时,往往必须执行一些额外的配置工作。很多时候,第二类驱动程序不能在体系结构上与大型主机的数据源兼容;即使做到了兼容,效果也是比较差。使用快速度的使用快速度的JdbcJdbc驱动驱动 第三类JDBC驱动程序是面向数据库中间件的纯Java驱动程序,JDBC调用被转换成一种中间件厂商的协议,中间件再把这些调用转换到数据库API。第三类JDBC驱动程序的优点是它以服务器为基础,也就是不再需要
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防爆警察实战技能训练考核手册
- 读书会总结收尾流程执行手册
- 武术竞技比赛动作指导手册
- 加盟店统一装修施工规范协议二篇
- 2026年电商平台入驻管理合同
- 期末综合素养测评卷(试题)- 苏教版数学 五年级上册
- 2027年陕西泾阳职业学院高职单招职业适应性测试考试模拟试卷及完整答案详解(夺冠系列)
- 2024年安徽蚌埠淮河职业学院单招职业技能考试题库【巩固】附答案详解
- 2027年四川凉山德昌职业学院高职单招职业技能考试题库附完整答案详解【名校卷】
- 2027年扬州工业职业学院单招综合素质考试模拟试卷附答案详解【能力提升】
- 2026北京市大兴区瀛海镇人民政府面向社会公开招聘劳务派遣2人笔试参考试题及答案详解
- 2026广东揭阳市惠来县卫生健康事业单位招聘综合类18人笔试题库附参考答案详解【A卷】
- 优化门诊护理流程提升患者满意度
- 2026年四川省机关事业单位考调、选调工作人员考试(综合知识、综合应用能力测试)测试题及答案
- 临床医学课程思政案例
- 短期与长期应对策略
- JT∕T 850-2013 挤压锚固钢绞线拉索
- 2024届福建省漳州市台商投资区六年级下学期小升初真题数学试卷含解析
- 2024福建检察机关书记员招聘笔试参考题库含答案解析
- 新规公路桥台抗震计算程序
- 天疱疮病人护理查房
评论
0/150
提交评论