文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Bean复制的几种框架性能比较(BeanUtils、PropertyUtils、BeanCopier)

2024-12-03 13:29

关注

比较的是四种复制的方式,分别为Apache的BeanUtils和PropertyUtils,Spring的BeanUtils,Cglib的BeanCopier。做法是在Eclipse新建了一个Project,专门用于专门测试几种代码的性能。具体的代码如下:

一个FromBean和一个ToBean,两个的代码基本上一样,除了类名称不一样,所以只是贴出来了一份。 

  1. public class FromBean {  
  2.     private String name;  
  3.     private int age;  
  4.     private String address;  
  5.     private String idno;  
  6.     private double money;   
  7.     public double getMoney() {  
  8.         return money;  
  9.     }   
  10.     public void setMoney(double money) {  
  11.         this.money = money;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }   
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public int getAge() {  
  20.         return age;  
  21.     }   
  22.     public void setAge(int age) {  
  23.         this.age = age;  
  24.     }   
  25.     public String getAddress() {  
  26.         return address;  
  27.     }  
  28.     public void setAddress(String address) {  
  29.         this.address = address;  
  30.     }  
  31.     public String getIdno() { 
  32.          return idno;  
  33.     } 
  34.     public void setIdno(String idno) {  
  35.         this.idno = idno;  
  36.     }   

一个用于测试的BenchmarkTest类,为了减少重复代码,写了一个策略模式 

  1. public class BenchmarkTest {  
  2.     private int count;  
  3.     public BenchmarkTest(int count) {  
  4.         this.count = count;  
  5.         System.out.println("性能测试" + this.count + "==================");  
  6.     }  
  7.     public void benchmark(IMethodCallBack m, FromBean frombean) {  
  8.         try {  
  9.             long begin = new java.util.Date().getTime();  
  10.             ToBean tobean = null 
  11.             System.out.println(m.getMethodName() + "开始进行测试");  
  12.             for (int i = 0; i < count; i++) {  
  13.                 tobean = m.callMethod(frombean);  
  14.             }  
  15.             long end = new java.util.Date().getTime();  
  16.             System.out.println(m.getMethodName() + "耗时" + (end - begin));  
  17.             System.out.println(tobean.getAddress());  
  18.             System.out.println(tobean.getAge());  
  19.             System.out.println(tobean.getIdno());  
  20.             System.out.println(tobean.getMoney());  
  21.             System.out.println(tobean.getName());  
  22.             System.out.println("                                      ");  
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  

策略中使用的接口声明 

  1. public interface IMethodCallBack {  
  2.     String getMethodName();  
  3.     ToBean callMethod(FromBean frombean)  throws Exception;  

使用的测试类 

  1. public class TestMain {  
  2.       
  3.     public static void main(String[] args) {  
  4.         FromBean fb = new FromBean();  
  5.         fb.setAddress("北京市朝阳区大屯路");  
  6.         fb.setAge(20);  
  7.         fb.setMoney(30000.111);  
  8.         fb.setIdno("110330219879208733");  
  9.         fb.setName("测试");  
  10.         IMethodCallBack beanutilCB = new IMethodCallBack() {  
  11.             @Override  
  12.             public String getMethodName() {  
  13.                 return "BeanUtil.copyProperties";  
  14.             }  
  15.             @Override  
  16.             public ToBean callMethod(FromBean frombean) throws Exception {  
  17.                 ToBean toBean = new ToBean();  
  18.                 BeanUtils.copyProperties(toBean, frombean);  
  19.                 return toBean;  
  20.             }  
  21.         };  
  22.         IMethodCallBack propertyCB = new IMethodCallBack() {  
  23.             @Override  
  24.             public String getMethodName() {  
  25.                 return "PropertyUtils.copyProperties";  
  26.             }  
  27.             @Override  
  28.             public ToBean callMethod(FromBean frombean) throws Exception {  
  29.                 ToBean toBean = new ToBean();  
  30.                 PropertyUtils.copyProperties(toBean, frombean);  
  31.                 return toBean;  
  32.             }  
  33.         };  
  34.         IMethodCallBack springCB = new IMethodCallBack() {  
  35.             @Override  
  36.             public String getMethodName() {  
  37.                 return "org.springframework.beans.BeanUtils.copyProperties";  
  38.             }  
  39.             @Override  
  40.             public ToBean callMethod(FromBean frombean) throws Exception {  
  41.                 ToBean toBean = new ToBean();  
  42.                 org.springframework.beans.BeanUtils.copyProperties(frombean,  
  43.                         toBean);  
  44.                 return toBean;  
  45.             }  
  46.         };  
  47.         IMethodCallBack cglibCB = new IMethodCallBack() {  
  48.             BeanCopier bc = BeanCopier.create(FromBean.class, ToBean.class,  
  49.                     false);  
  50.             @Override 
  51.              public String getMethodName() {  
  52.                 return "BeanCopier.create";  
  53.             }  
  54.             @Override  
  55.             public ToBean callMethod(FromBean frombean) throws Exception {  
  56.                 ToBean toBean = new ToBean();  
  57.                 bc.copy(frombean, toBean, null);  
  58.                 return toBean;  
  59.             }  
  60.         };  
  61.         // 数量较少的时候,测试性能  
  62.         BenchmarkTest bt = new BenchmarkTest(10);  
  63.         bt.benchmark(beanutilCB, fb);  
  64.         bt.benchmark(propertyCB, fb);  
  65.         bt.benchmark(springCB, fb);  
  66.         bt.benchmark(cglibCB, fb);  
  67.         // 测试一万次性能测试  
  68.         BenchmarkTest bt10000 = new BenchmarkTest(10000);  
  69.         bt10000.benchmark(beanutilCB, fb);  
  70.         bt10000.benchmark(propertyCB, fb);  
  71.         bt10000.benchmark(springCB, fb);  
  72.         bt10000.benchmark(cglibCB, fb);  
  73.         // 担心因为顺序问题影响测试结果  
  74.         BenchmarkTest bt1000R = new BenchmarkTest(10000);  
  75.         bt1000R.benchmark(cglibCB, fb);  
  76.         bt1000R.benchmark(springCB, fb);  
  77.         bt1000R.benchmark(propertyCB, fb);  
  78.         bt1000R.benchmark(beanutilCB, fb);  
  79.     }  

进行了三次测试,最后的结果如下:

不过需要注意的是,Cglib在测试的时候,先进行了实例的缓存,这个也是他性能较好的原因之一。如果把缓存去掉的话,性能就会出现了一些的差异,但是整体的性能还是很好,不过奇怪的是10000次反而比10次少,而且后面的反转1万次反而耗时最少,进行多次测试效果也是如此。

从整体的表现来看,Cglib的BeanCopier的性能是最好的无论是数量较大的1万次的测试,还是数量较少10次,几乎都是趋近与零损耗,Spring是在次数增多的情况下,性能较好,在数据较少的时候,性能比PropertyUtils的性能差一些。

PropertyUtils的性能相对稳定,表现是呈现线性增长的趋势。而Apache的BeanUtil的性能最差,无论是单次Copy还是大数量的多次Copy性能都不是很好。

性能测试就到这里,数据也展示如上,后续会继续编写剩余两篇文章,这一片关注性能,后面的一篇是就每种方式的使用上的差异进行详解,最后一篇想进行探讨是什么早就了这四种方式的性能差异。 

 

来源:Java知音内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯