Commons组件之BeanUtils.copyProperties()的效率——copyProperties的效率分析:

因为BeanUtils.copyProperties()这个方法的便利,而且实现2个对象的相同字段名称的属性value的拷贝。但是各家的实现算法又是不同的,所以效率也有所差别。测试代码如下:

public void  CalEfficence()  throws IllegalAccessException, InvocationTargetException{
  Long traditionalCopyTime = 0L;
  Long springCopyPropertiesTime = 0L;
  Long commonsCopyPropertiesTime = 0L;

  start = System.currentTimeMillis();
  for(int i=0; i<LOOP_NUMBER; i++){
   testBean = new TestBean();
   testBean.setTestName1("1");
   testBean.setTestName2("2");
   testBean.setTestName3("3");
   testBean.setTestName4("4");
   testBean.setTestName5("This is a test");
   testBean.setTestName6("testtesttesttesttesttesttesttesttest");
   testBean.setTestName7("testtesttesttesttesttesttesttesttest");
   testBean.setTestName8("testtesttesttesttesttesttesttesttest");
   testBean.setTestName9("testtesttesttesttesttesttesttesttest");
   testBean.setTestName10("testtesttesttesttesttesttesttesttest");
   testBean.setTestName11("testtesttesttesttesttesttesttesttest");
   testBean.setTestName12("testtesttesttesttesttesttesttesttest");
   testBean.setTestName13("testtesttesttesttesttesttesttesttest");
   testBean.setTestName14("testtesttesttesttesttesttesttesttest");
   testBean.setTestName15("testtesttesttesttesttesttesttesttest");
   testBean.setTestName16("testtesttesttesttesttesttesttesttest");
   testBean.setTestName17("testtesttesttesttesttesttesttesttest");
   testBean.setTestName18("testtesttesttesttesttesttesttesttest");
   testBean.setTestName19("testtesttesttesttesttesttesttesttest");
   testBean.setTestName20("testtesttesttesttesttesttesttesttest");
   testBean.setTestName21(new java.util.Date(System.currentTimeMillis()));
   testBean.setTestName22(new java.sql.Date(System.currentTimeMillis()));
   testBean.setTestName23(2012L);
   testBean.setTestName24(3.1415926D);
  }
  end = System.currentTimeMillis();
  traditionalCopyTime = end - start;

  TestBean testBean1 = new TestBean();
  start = System.currentTimeMillis();
  for(int i=0; i<LOOP_NUMBER; i++) {
   //copyPerpoties(orig, dest)
   org.springframework.beans.BeanUtils.copyProperties(testBean, testBean1);
  }
  end = System.currentTimeMillis();
  springCopyPropertiesTime = end - start;

  TestBean testBean2 = new TestBean();
  start = System.currentTimeMillis();
  for(int i=0; i<LOOP_NUMBER; i++){
   //copyPerpoties(dest, orig)
   org.apache.commons.beanutils.BeanUtils.copyProperties(testBean2, testBean);
  }
  end = System.currentTimeMillis();
  commonsCopyPropertiesTime  = end - start;

  System.out.println("循环"+LOOP_NUMBER+"次的结果:");
  System.out.println("用Setter方法耗时"+ traditionalCopyTime +"ms");
  System.out.println("用Spring的BeanUtils.copyProperties()方法耗时"+springCopyPropertiesTime +"ms");
  System.out.println("用Commons包的BeanUtils.copyProperties()方法耗时"+commonsCopyPropertiesTime +"ms"); 
}

这个是我百度了某位大佬的文章,看到的,觉得很不错,我就记下了。

测试结果:

循环1次的结果:
用Setter方法耗时16ms;
用Spring的BeanUtils.copyProperties()方法耗时266ms;
用Commons包的BeanUtils.copyProperties()方法耗时125ms。

循环10次的结果:
用Setter方法耗时0ms;
用Spring的BeanUtils.copyProperties()方法耗时203ms;
用Commons包的BeanUtils.copyProperties()方法耗时125ms。

循环100次的结果:
用Setter方法耗时0ms;
用Spring的BeanUtils.copyProperties()方法耗时250ms;
用Commons包的BeanUtils.copyProperties()方法耗时218ms。

循环500次的结果:
用Setter方法耗时0ms;
用Spring的BeanUtils.copyProperties()方法耗时266ms;
用Commons包的BeanUtils.copyProperties()方法耗时500ms。

循环5000次的结果:
用Setter方法耗时16ms;
用Spring的BeanUtils.copyProperties()方法耗时421ms;
用Commons包的BeanUtils.copyProperties()方法耗时2829ms。

循环100000次的结果:
用Setter方法耗时78ms;
用Spring的BeanUtils.copyProperties()方法耗时3000ms;
用Commons包的BeanUtils.copyProperties()方法耗时53328ms。

可以看出当循环的次数不太大时(文中小于100次),Commons组件的copyProperties比Spring的copyProperties效率要高;
当循环次数增大时,Commons组件的copyProperties方法的时间开销急剧的增加,达到Spring的copyProperties方法的10倍或更高;
在整个测试过程中,虽然setter代码比较冗长,但效率却一直是最好的,尤其当循环次数增多的时候,它的高效率更完美的体现出来了。

结论:推荐使用setter方法,尤其是需要循环处理多次的时候。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。