您的位置:首页 > 编程语言

为了提升性能,应关注代码的每个细节

2009-10-15 17:41 447 查看
今天不是太忙,想着上次写的代码还没有做测试,于是写了一个类模拟代码功能做测试:

1:demand

从数据库里读出来要下发短信的记录----->下发短信------>更改记录状态(即下发完成以后更新数据库)

2:实现方法:

a:多线程下发,下发一条完成以后,就更新到数据库

b:多线程下发,先更新内存中记录的状态,下发全部完成以后再从内存里批量更新到数据库

当数据库大时,为了提高处理效率,显然我选择第二种方案

3:code(模拟代码)

public class BatchTest {
private static final int SENDTIMES_ONCE = 100;
private static int count2;
/**
* @param args
*/
public static void main(String[] args) {
List<Integer> list = setListValue();
updCacheToDB(list);
}
public static List<Integer> setListValue(){
List list = new ArrayList();
for(int i=0;i<1000893;i++){
list.add(i);
}
return list;
}
public static void updCacheToDB(List<Integer> smsAlertsList){
LinkedList<Integer> tempList = new LinkedList<Integer>();
long startTime = System.currentTimeMillis();
int count = 0;//计数
if(smsAlertsList!=null){
//当下发数量小于SENDTIMES_ONCE
if(smsAlertsList.size()<SENDTIMES_ONCE){
updBatchToDB(smsAlertsList);
}
else{//当下发数量大于SENDTIMES_ONCE
for(Integer po:smsAlertsList){
//添加到集合
tempList.offer(po);
if(tempList.size()==SENDTIMES_ONCE){
updBatchToDB(tempList);
count++;
}
//当最后数量不到SENDTIMES_ONCE时,更新到数据库
if(smsAlertsList.size()-count*SENDTIMES_ONCE<SENDTIMES_ONCE){
updBatchToDB(tempList);
}
}

}
}
long endTime = System.currentTimeMillis();
System.out.println("用时"+(endTime-startTime)/1000+"秒");
}

public static void updBatchToDB(List smsAlertsList){

for (int i = 0; i < smsAlertsList.size(); i++) {
//更新已经下发次数
System.out.print(smsAlertsList.get(i)+" ");
}
count2++;

//清空集合
smsAlertsList.clear();
System.out.println("第"+count2+"行");
}
}

测试时发现到1000000以后的数据都是每一条执行一次,而不是批量操作的,后来发现问题出现在

//当最后数量不到SENDTIMES_ONCE时,更新到数据库
if(smsAlertsList.size()-count*SENDTIMES_ONCE<SENDTIMES_ONCE){
updBatchToDB(tempList);
}

应该放在for(Integer po:smsAlertsList){
//添加到集合
tempList.offer(po);
if(tempList.size()==SENDTIMES_ONCE){
updBatchToDB(tempList);
count++;
}
}的外面而不是放在里面!

4.ArrayList和LinkedList 在大数据量添加的时候,性能比较

测试代码数据量是:1000893

功能:设值和取值

上面代码用LinedList,测试时间是18秒

ArrayList ,测试时间是23秒

当然这有时取决于你cpu占用率,可能每次测试时间不一样,但此代码里用LinkedList永远比ArrayList节省时间些

他们之间的差异原因是:他们底层数据结构不一样,不知道的朋友可以找找这方面的文章

5:我们在写代码时应该多做测试,重构,关注代码的每一个实现细节,这样才能写出来高性能的程序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: