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

今天不是太忙,想着上次写的代码还没有做测试,于是写了一个类模拟代码功能做测试:

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:我们在写代码时应该多做测试,重构,关注代码的每一个实现细节,这样才能写出来高性能的程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值