java代码性能优化3

java代码性能优化三

 

使用局部缓存

在 DALC 方法中,很多地方需要对返回的集合进行处理(设置每个实体相关的类名、包名、安全域名等),每个名字都需要从模型缓存中查询,如果集合中相当一部份名字 是重复的(很多情况下都是如此),每次都查询是没有必要的。通过在方法中添加局部缓存,这类操作的性能提升明显。

如:BusinessAttributeDALC.selectAllAttrsOfTheClass() 取类型 的所有属性,在取得属性后会调用convertBusinessAttributes 为属性设置:父属性名、包名、安全域名等相关名称,原实现 是对每个属性分别查询模型缓存,现在改成局部缓存方式(这些值中有很多是重复的)。方法调用时间减少一半。本机 执行BusinessAttributeDALC.selectAllAttrsOfTheClass() ,mw112 数据库,共1000 个属性记录,目标类型上有95 个属性,没有调优之前 需要65MS ,调优后只需 要33MS ,其中查询BusinessAttribute 缓存需要28MS 。

同时还发现,有些对模型的查询方法其实可以使用主键,但仍使用Condition 去查找,结果就是对模型缓存的遍历。

减少方法调用的层次   

        在代码中发现当需要对集合进行处理时,会在循环中调用单对象 处理方法(方法代码可能只有 2-3行,但会有多个 new DALC 操作),其实这样的效率是比较低的。这里单对象 方法中的 DALC 不能被重用,导致 JVM 需要创建大量的 DALC 实例,之后再回收。

        调用层次过多本身就有一些性能问题。每层方法的调用都需要 Stack 操作。

尽量减少使用 Reflect

        Reflect 一方面性能比较低,另一方面会降低代码的可读性。

        接口方法调用的性能明显高于 Reflect 。

        比如对目标数组使用 Array 类的方法进行遍历时,性能是比较低的。

正确的数组复制方法

        在对数组进行复制(全部或部份)时,尽量使用 System.arrayCopy 方法而不是进行遍历赋值。数组元素个数越多差别越明显, System.arrayCopy 性能基本无变化(使用 Native Method 实现)。

        DataRow.clone 会对 byte[] 进行 clone ,如果这个数组比较大( BLOB 字段),改成 System.arrayCopy比遍历性能高的多。

合理重用对象

        对象的创建比较耗用资源,可以合理地重用一些对象,比如模型服务中有很多 Handler ,如果有必要可以设计成可重用的 Handler ,通过一个 clear() 清理所有中间数据,通过 init(…) 重新初始化数据。

        这里的重用是指在一次串行调用的循环中,不必每次都重新创建实例。

        重用的好处主要包括:减少创建对象的个数;减轻 GC 的压力;

 

 

更多信息请查看 java进阶网 http://www.javady.com