现象:系统中如果出现10万个以上的对象从数据库中加载,将耗时1小时左右
分析:开始以为是加载的时候使用反射机制,根据类的名称使用Class.foName(),然后使用newInstance()方法带来了性能的下降,于是将Class.foName产生的Class缓存,但是性能没有较好的提升,查资料发现Class.foName已经使用了缓存,后来比较了用clone()方法代替newInstance方法,经过测试发现clone方法可以提高50%-1000%的速度。但是使用克隆方法对代码的改动比较大,因此将此建议放到下一版中进行。
后来跟踪代码执行过程发现在加载对象时,每一对象都要到数据库查询一次,因此很耗时,所以在服务器启动时加了一个数据库对象表的缓存,将所有的数据库信息通过一个查询一次取到系统缓存,然后才开始加载,最后发现此中方法的性能可以提高10倍左右。
结论:在提高系统性能时,首要考察的地方是执行最多次的方法或函数,找到可能出现的性能瓶颈,但是不能轻易下结论,需要用例测试