关于BeanUtil.copyProperties性能

BeanUtil.copyProperties 方法确实很方便,代码写出来非常优美,不会有很多的get set,但由于用到反射,可能存在潜在的性能问题。因此对spring 和 commons的BeanUtil.copyProperties进行了对照测试,代码大致如下:

Java代码   收藏代码
  1. @Test   
  2.     public   void  copyPropertiesTest()  throws  IllegalAccessException, InvocationTargetException {  
  3.           
  4.         po = new  PromotionPO();  
  5.         Timestamp now = new  Timestamp(System.currentTimeMillis());  
  6.         model = RetailmodelFactory.eINSTANCE.createPromotion();  
  7. //get/set   
  8.         Long startTime = System.currentTimeMillis();  
  9.         for  ( int  i =  0 ; i < LOOP_NUMBER; i++) {  
  10.             model.setCode("code" );  
  11.             model.setDescription("haha" );  
  12.             model.setDiscount(5.4 );  
  13.             model.setEndTime(now);  
  14.             model.setID(39578395L);  
  15.             model.setPriority(1 );  
  16.             model.setPromotionType(3 );  
  17.             model.setStartTime(now);  
  18.             model.setSupplierID("123245L" );  
  19.         }  
  20.         Long endTime = System.currentTimeMillis();  
  21.         traditionalCopyTIme = endTime - startTime;  
  22.           
  23. //spring   
  24.         startTime = System.currentTimeMillis();  
  25.         for  ( int  i =  0 ; i < LOOP_NUMBER; i++) {  
  26.             BeanUtils.copyProperties(model, po);  
  27.         }  
  28.         endTime = System.currentTimeMillis();  
  29.         springCopyPropertiesTime = endTime - startTime;  
  30.   
  31. //commons          
  32.         startTime = System.currentTimeMillis();  
  33.         for  ( int  i =  0 ; i < LOOP_NUMBER; i++) {  
  34.             org.apache.commons.beanutils.BeanUtils.copyProperties(po,model);  
  35.         }  
  36.         endTime = System.currentTimeMillis();  
  37.         commonsCopyPropertiesTime = endTime - startTime;  
  38.           
  39.         logger.info("normal copy Time: "  +  traditionalCopyTIme +  "ms." );  
  40.         logger.info("Spring BeanUtil copy Time: "  +  springCopyPropertiesTime +  "ms." );  
  41.         logger.info("Commons BeanUtil copy Time: "  +  commonsCopyPropertiesTime +  "ms." );  
  42.     }  


当 LOOP_NUMBER = 50000时(即执行50000次copy),结果如下:

编号 set/get Spring BeanUtil Commons BeanUtil
1 62ms 1703ms 63860ms
1 16ms 1359ms 62328ms
1 16ms 1359ms 63047ms
1 0ms 1390ms 63047ms
1 16ms 1375ms 62266ms



可看出Commons BeanUtil的copyProperties 性能最差,几乎不能忍受。spring的copyProperties有可能在接受范围内。直接set/get虽然丑陋,但是性能确实非常好,几乎可以忽略。
接下来对spring和commons两种不同实现进行分析。

你可能感兴趣的:(copyProperties)