﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Goingmm-文章分类-Java</title><link>http://www.blogjava.net/goingmm/category/3538.html</link><description>&lt;!--
&lt;table&gt;
&lt;tr&gt;
&lt;font color="red"&gt;共有&lt;script src="http://fastonlineusers.com/online.php?d=goingmm.blogjava.net"&gt;&lt;/script&gt;人正在阅读&lt;/font&gt;
&lt;/tr&gt;
&lt;/table&gt;
--&gt;
</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 18:45:43 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 18:45:43 GMT</pubDate><ttl>60</ttl><item><title>J2EE项目 编码调优</title><link>http://www.blogjava.net/goingmm/articles/15075.html</link><dc:creator>Goingmm</dc:creator><author>Goingmm</author><pubDate>Sun, 09 Oct 2005 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/goingmm/articles/15075.html</guid><wfw:comment>http://www.blogjava.net/goingmm/comments/15075.html</wfw:comment><comments>http://www.blogjava.net/goingmm/articles/15075.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/goingmm/comments/commentRss/15075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/goingmm/services/trackbacks/15075.html</trackback:ping><description><![CDATA[<P>　<BR>　　<FONT color=#ff0000><FONT face=Tahoma><STRONG><FONT face=Garamond>申请这个blog很长时间了．一直没有机会发点帖子（一直想写点自己的东西，但是没有能找到合适的主题）．今天被同事"嘲笑了一盘"．那就来吧，留下点出没过的痕迹．</FONT></STRONG><BR></FONT></FONT>&nbsp;&nbsp;&nbsp;&nbsp; 　<BR>小议: J2EE项目 编码调优<BR><BR>　　眼下很多j2ee项目性能不佳的主要瓶颈并不是发生在编码．但是无谓的系统开销，纠缠不清，饶来饶去的业务逻辑．这些都是可以避免的．可能每一个程序员都希望自己能写出高效的，漂亮的代码吧．至少我是带着这点想法，开始寻求解决办法的．．．<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>　下面的部分内容是针对实际项目中遇到的情况．举例一些例子，只是为了更好的表达僵硬的描述．</P>
<P>　1) 避免对象的重复创建</P>
<P>　　■ 对象的创建对于系统内存而言是非常昂贵的.在非必要的时候应该避免重复创建对象.需要的时候声明它,初始化它,不要重复初始化一个对象,尽量<BR>　　　能做到再使用,而用完后置null有利于垃圾收集。<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 　　 比如: request.getSession().removeAttribute("XXXX_XXXX");<BR>　　　　　　................................................ ;<BR>&nbsp; 　　　修改: HttpSession obj = request.getSession();<BR>　　　　　　obj.removeAttribute("XXXX_XXXX");<BR>　　　　　　............................... ;<BR>　　　　　　obj = null;<BR><BR>　　■ 避免方法的非必要重复调用<BR>　　　　比如: <BR>　　　　　　for(int i=0;i<OBJ.SIZE();I++)<BR>　　　　修改:<BR>　　　　　　int size = obj.size();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i<SIZE;I++)< FONT></P>
<P>　　■ 让类实现Cloneable接口,同时采用工厂模式,将减少类的创建,每次都是通过clone()方法来获得对象。<BR>　　■ 另外使用接口也能减少类的创建<BR>　　■ 对于成员变量的初始化也应尽量避免,特别是在一个类派生另一个类时.</P>
<P>2)&nbsp; 使用合适的类型<BR>　　　当原始类型不能满足我们要求时,使用复杂类型。String和StringBuffer的区别自不必说了,是我们使用最多的类型,在涉及到字符运算时,强烈建议使<BR>　 用StringBuffer。在做String匹配时使用intern()代替equal().<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; +--------------------------------------------------------------<BR>&nbsp;&nbsp; |&nbsp;　关于 public native String intern() :<BR>&nbsp;&nbsp; |&nbsp;　返回一个字符串对象的规范表示法。 <BR>&nbsp;&nbsp; |　　如果 s 和 t 是 s.equals(t) 类型的字符串，那就保证了　s.intern() == t.intern()<BR>&nbsp;&nbsp; |　返回: <BR>&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 　　一个同该字符串内容相同的字符串，但是来自于唯一字符串的缓冲池<BR>&nbsp;&nbsp; +-----------------------------------------------------------------</P>
<P>3)&nbsp; 常用容器的选择<BR>&nbsp;&nbsp; 　　ArrayList和Vector,HashMap和Hashtable是我们经常用到的类,前者不支持同步,后者支持同步,前者性能更好,大多数情况下选择前者</P>
<P>4)&nbsp; final 的使用<BR>&nbsp;&nbsp;&nbsp;&nbsp; 　带有final修饰符的类是不可派生的, 如果指定一个类为final，则该类所有的方法都是final,Java编译器会寻找机会内联所有的final方法,<BR>　这将能够使性能平均提高50%。类的属性和方式 使用final或者static修饰符也是有好处的,但是一定要慎用，对他的使用需要做性能和后<BR>　果权衡．<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; 建议InitXxxAction中:需要拿一些parameter的时候可以写成final的"小方法＂．<BR>&nbsp;&nbsp; 比如:<BR>&nbsp;　private final WebForward retrieveParam(WebActionMapping mapping,HttpServletRequest request){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO....<BR>&nbsp;　}</P>
<P>５）调用方法时传递的参数以及在调用中创建的临时变量都保存在栈（Stack）中，速度较快。所以尽量使用局部变量</P>
<P>６）不要误用了 异常&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; 　 　异常抛出对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为,fillInStackTrace()的本地（Native）<BR>　　方法fillInStackTrace()方法检查堆栈，收集调用跟踪信息。只要有异常被抛出，VM就必须调整调用堆栈，因为在处理过程中创建了一<BR>　　个新的对象。异常只能用于错误处理，不要试图用来控制程序流程．</P>
<P>７）善用调试<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ■ 代码中不要留下硬调语句 比如: System.out.println()　　<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ■ 应该选用和配置的调试工具.实施后都应该关闭输出 比如:log4j<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ■ 尽量少用串行化、同步操作和耗时昂贵的服务 比如:Date()</P>
<P><BR>　　暂时写下这些吧！第一次写blog感觉有点累人呢！有什么新的体会再补充...</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/goingmm/aggbug/15075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/goingmm/" target="_blank">Goingmm</a> 2005-10-09 17:35 <a href="http://www.blogjava.net/goingmm/articles/15075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>