申请这个blog很长时间了.一直没有机会发点帖子(一直想写点自己的东西,但是没有能找到合适的主题).今天被同事"嘲笑了一盘".那就来吧,留下点出没过的痕迹.
小议: J2EE项目 编码调优
眼下很多j2ee项目性能不佳的主要瓶颈并不是发生在编码.但是无谓的系统开销,纠缠不清,饶来饶去的业务逻辑.这些都是可以避免的.可能每一个程序员都希望自己能写出高效的,漂亮的代码吧.至少我是带着这点想法,开始寻求解决办法的...
下面的部分内容是针对实际项目中遇到的情况.举例一些例子,只是为了更好的表达僵硬的描述.
1) 避免对象的重复创建
■ 对象的创建对于系统内存而言是非常昂贵的.在非必要的时候应该避免重复创建对象.需要的时候声明它,初始化它,不要重复初始化一个对象,尽量
能做到再使用,而用完后置null有利于垃圾收集。
比如: request.getSession().removeAttribute("XXXX_XXXX");
................................................ ;
修改: HttpSession obj = request.getSession();
obj.removeAttribute("XXXX_XXXX");
............................... ;
obj = null;
■ 避免方法的非必要重复调用
比如:
for(int i=0;i 修改:
int size = obj.size();
for(int i=0;i
■ 让类实现Cloneable接口,同时采用工厂模式,将减少类的创建,每次都是通过clone()方法来获得对象。
■ 另外使用接口也能减少类的创建
■ 对于成员变量的初始化也应尽量避免,特别是在一个类派生另一个类时.
2) 使用合适的类型
当原始类型不能满足我们要求时,使用复杂类型。String和StringBuffer的区别自不必说了,是我们使用最多的类型,在涉及到字符运算时,强烈建议使
用StringBuffer。在做String匹配时使用intern()代替equal().
+--------------------------------------------------------------
| 关于 public native String intern() :
| 返回一个字符串对象的规范表示法。
| 如果 s 和 t 是 s.equals(t) 类型的字符串,那就保证了 s.intern() == t.intern()
| 返回:
| 一个同该字符串内容相同的字符串,但是来自于唯一字符串的缓冲池
+-----------------------------------------------------------------
3) 常用容器的选择
ArrayList和Vector,HashMap和Hashtable是我们经常用到的类,前者不支持同步,后者支持同步,前者性能更好,大多数情况下选择前者
4) final 的使用
带有final修饰符的类是不可派生的, 如果指定一个类为final,则该类所有的方法都是final,Java编译器会寻找机会内联所有的final方法,
这将能够使性能平均提高50%。类的属性和方式 使用final或者static修饰符也是有好处的,但是一定要慎用,对他的使用需要做性能和后
果权衡.
建议InitXxxAction中:需要拿一些parameter的时候可以写成final的"小方法".
比如:
private final WebForward retrieveParam(WebActionMapping mapping,HttpServletRequest request){
// TODO....
}
5)调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。所以尽量使用局部变量
6)不要误用了 异常
异常抛出对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为,fillInStackTrace()的本地(Native)
方法fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一
个新的对象。异常只能用于错误处理,不要试图用来控制程序流程.
7)善用调试
■ 代码中不要留下硬调语句 比如: System.out.println()
■ 应该选用和配置的调试工具.实施后都应该关闭输出 比如:log4j
■ 尽量少用串行化、同步操作和耗时昂贵的服务 比如:Date()
暂时写下这些吧!第一次写blog感觉有点累人呢!有什么新的体会再补充...