循环在大多数项目中都会用到,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。让我们看看下面的代码片:..
Vector vect = new Vector(1000);
...
for( inti=0; i<vect.size(); i++){
...
}
for循环部分改写成:
int size = vect.size();
for( int i=0; i>size; i++){
...
}
如果size=1000,就可以减少1000次size()的系统调用开销,避免了循环体重复调用。
for (int i = 0;i <100000;i++)
if (i%10 == 9) {
... // 每十次执行一次
}
改写成也可以提高效率:..
for(inti =0,j =10; i<100000; i++,j--){
if(j == 0){
... // 每十次执行一次
j = 10;
}
}
所以,当有较大的循环时,应该检查循环内是否有效率不高的地方,寻找更优的方案加以改进。
真实案例:
某银行系统的综合查询功能优化:
综合查询功能需要预先设置所要查询内容的机构,按照省、市、县划分,如果只选择一两个机构执行时间在2-5秒,当选择30多个省级机构时,需要将近2分钟,有时还会超时,如果全国县级机构全选,结果可想而知。
经分析发现:选择机构时,需要到系统缓存查询用户权限,判断所选机构是否在在其权限范围内。
系统原来的做法是:将所选机构放入 循环体1 ,再去查询读取用户拥有查询权限的机构,逐级迭代比较是否与所选机构相等。这样相当于选择多少机构,就要执行多少次查询用户权限的操作。
优化方案1:将读取用户权限的操作 从 循环体1 抽出来,放入一个缓存对象,在循环体内,用此对象和所选机构进行比较。结果很明显,只做一次查询用户权限操作,速度自然快很多,选1000家机构,也可以保证在5秒内完成。
方案2大家想想,可以从不同层面优化。