在?DALC?方法中,很多地方需要对返回的集合进行处理(设置每个实体相关的类名、包名、安全域名等),每个名字都需要从模型缓存中查询,如果集合中相当一部份名字?是重复的(很多情况下都是如此),每次都查询是没有必要的。通过在方法中添加局部缓存,这类操作的性能提升明显。
比如:BusinessAttributeDALC.selectAllAttrsOfTheClass()?取类型?的所有属性,在取得属性后会调用convertBusinessAttributes?为属性设置:父属性名、包名、安全域名等相关名称,原实现?是对每个属性分别查询模型缓存,现在改成局部缓存方式(这些值中有很多是重复的)。方法调用时间减少一半。本机?执行BusinessAttributeDALC.selectAllAttrsOfTheClass()?,mw112?数据库,共1000?个属性记录,目标类型上有95?个属性,没有调优之前?需要65MS?,调优后只需?要33MS?,其中查询BusinessAttribute?缓存需要28MS?。
同时还发现,有些对模型的查询方法其实可以使用主键,但仍使用Condition?去查找,结果就是对模型缓存的遍历。
????????在代码中发现当需要对集合进行处理时,会在循环中调用单对象?处理方法(方法代码可能只有?2-3行,但会有多个?new DALC?操作),其实这样的效率是比较低的。这里单对象?方法中的?DALC?不能被重用,导致?JVM?需要创建大量的?DALC?实例,之后再回收。
????????调用层次过多本身就有一些性能问题。每层方法的调用都需要?Stack?操作。
????????Reflect?一方面性能比较低,另一方面会降低代码的可读性。
????????接口方法调用的性能明显高于?Reflect?。
????????比如对目标数组使用?Array?类的方法进行遍历时,性能是比较低的。
????????在对数组进行复制(全部或部份)时,尽量使用?System.arrayCopy?方法而不是进行遍历赋值。数组元素个数越多差别越明显,?System.arrayCopy?性能基本无变化(使用?Native Method?实现)。
????????DataRow.clone?会对?byte[]?进行?clone?,如果这个数组比较大(?BLOB?字段),改成?System.arrayCopy比遍历性能高的多。
????????对象的创建比较耗用资源,可以合理地重用一些对象,比如模型服务中有很多?Handler?,如果有必要可以设计成可重用的?Handler?,通过一个?clear()?清理所有中间数据,通过?init(…)?重新初始化数据。
????????这里的重用是指在一次串行调用的循环中,不必每次都重新创建实例。
????????重用的好处主要包括:减少创建对象的个数;减轻?GC?的压力;
?
?
?