成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Bean復制的幾種框架性能比較(BeanUtils、PropertyUtils、BeanCopier)

開發 后端
閱讀代碼的諸多好處就不說了,我就直奔主題,通過預讀代碼,發現了幾種實現兩個不同類型的Bean之間實現值復制的幾種方式,上網查詢后發現性能上會有差異,于是就萌生自己深入了解幾種實現的想法。

 作為一個新員工,一個首要的工作就是閱讀別人的代碼,閱讀代碼的諸多好處就不說了,我就直奔主題,通過預讀代碼,發現了幾種實現兩個不同類型的Bean之間實現值復制的幾種方式,上網查詢后發現性能上會有差異,于是就萌生自己深入了解幾種實現的想法。第一步就是先本著實事求是的原則去探求一下大家總結出來的性能差異是否正確。

比較的是四種復制的方式,分別為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.      * @param args  
  4.      */  
  5.     public static void main(String[] args) {  
  6.         FromBean fb = new FromBean();  
  7.         fb.setAddress("北京市朝陽區大屯路");  
  8.         fb.setAge(20);  
  9.         fb.setMoney(30000.111);  
  10.         fb.setIdno("110330219879208733");  
  11.         fb.setName("測試");  
  12.         IMethodCallBack beanutilCB = new IMethodCallBack() {  
  13.             @Override  
  14.             public String getMethodName() {  
  15.                 return "BeanUtil.copyProperties";  
  16.             }  
  17.             @Override  
  18.             public ToBean callMethod(FromBean frombean) throws Exception {  
  19.                 ToBean toBean = new ToBean();  
  20.                 BeanUtils.copyProperties(toBean, frombean);  
  21.                 return toBean;  
  22.             }  
  23.         };  
  24.         IMethodCallBack propertyCB = new IMethodCallBack() {  
  25.             @Override  
  26.             public String getMethodName() {  
  27.                 return "PropertyUtils.copyProperties";  
  28.             }  
  29.             @Override  
  30.             public ToBean callMethod(FromBean frombean) throws Exception {  
  31.                 ToBean toBean = new ToBean();  
  32.                 PropertyUtils.copyProperties(toBean, frombean);  
  33.                 return toBean;  
  34.             }  
  35.         };  
  36.         IMethodCallBack springCB = new IMethodCallBack() {  
  37.             @Override  
  38.             public String getMethodName() {  
  39.                 return "org.springframework.beans.BeanUtils.copyProperties";  
  40.             }  
  41.             @Override  
  42.             public ToBean callMethod(FromBean frombean) throws Exception {  
  43.                 ToBean toBean = new ToBean();  
  44.                 org.springframework.beans.BeanUtils.copyProperties(frombean,  
  45.                         toBean);  
  46.                 return toBean;  
  47.             }  
  48.         };  
  49.         IMethodCallBack cglibCB = new IMethodCallBack() {  
  50.             BeanCopier bc = BeanCopier.create(FromBean.class, ToBean.class,  
  51.                     false);  
  52.             @Override 
  53.              public String getMethodName() {  
  54.                 return "BeanCopier.create";  
  55.             }  
  56.             @Override  
  57.             public ToBean callMethod(FromBean frombean) throws Exception {  
  58.                 ToBean toBean = new ToBean();  
  59.                 bc.copy(frombean, toBean, null);  
  60.                 return toBean;  
  61.             }  
  62.         };  
  63.         // 數量較少的時候,測試性能  
  64.         BenchmarkTest bt = new BenchmarkTest(10);  
  65.         bt.benchmark(beanutilCB, fb);  
  66.         bt.benchmark(propertyCB, fb);  
  67.         bt.benchmark(springCB, fb);  
  68.         bt.benchmark(cglibCB, fb);  
  69.         // 測試一萬次性能測試  
  70.         BenchmarkTest bt10000 = new BenchmarkTest(10000);  
  71.         bt10000.benchmark(beanutilCB, fb);  
  72.         bt10000.benchmark(propertyCB, fb);  
  73.         bt10000.benchmark(springCB, fb);  
  74.         bt10000.benchmark(cglibCB, fb);  
  75.         // 擔心因為順序問題影響測試結果  
  76.         BenchmarkTest bt1000R = new BenchmarkTest(10000);  
  77.         bt1000R.benchmark(cglibCB, fb);  
  78.         bt1000R.benchmark(springCB, fb);  
  79.         bt1000R.benchmark(propertyCB, fb);  
  80.         bt1000R.benchmark(beanutilCB, fb);  
  81.     }  

進行了三次測試,最后的結果如下:

不過需要注意的是,Cglib在測試的時候,先進行了實例的緩存,這個也是他性能較好的原因之一。如果把緩存去掉的話,性能就會出現了一些的差異,但是整體的性能還是很好,不過奇怪的是10000次反而比10次少,而且后面的反轉1萬次反而耗時最少,進行多次測試效果也是如此。

從整體的表現來看,Cglib的BeanCopier的性能是最好的無論是數量較大的1萬次的測試,還是數量較少10次,幾乎都是趨近與零損耗,Spring是在次數增多的情況下,性能較好,在數據較少的時候,性能比PropertyUtils的性能差一些。

PropertyUtils的性能相對穩定,表現是呈現線性增長的趨勢。而Apache的BeanUtil的性能最差,無論是單次Copy還是大數量的多次Copy性能都不是很好。

性能測試就到這里,數據也展示如上,后續會繼續編寫剩余兩篇文章,這一片關注性能,后面的一篇是就每種方式的使用上的差異進行詳解,最后一篇想進行探討是什么早就了這四種方式的性能差異。 

 

責任編輯:龐桂玉 來源: Java知音
相關推薦

2021-05-31 10:16:04

代碼Java工具

2011-04-15 10:26:38

JavaMVC

2021-01-13 05:25:49

框架代碼性能

2013-12-16 10:20:48

MySQL數據庫

2012-12-03 10:26:51

Scala

2009-05-25 08:39:08

iPhone蘋果移動OS

2011-05-18 14:52:04

XML

2020-10-23 07:43:37

Log配置性能

2009-07-01 18:12:18

JSP的優勢性能比較

2011-07-06 14:18:40

Percona SerMySQL

2015-02-05 09:25:51

HTTPSSPDYHTTP2

2010-03-10 16:35:23

Python編程語言

2020-07-27 08:24:42

編程語言C語言Java

2023-11-20 10:34:09

語言

2009-12-04 19:28:25

FreeBSD 8.0Ubuntu 9.10性能比較

2010-12-27 16:01:45

jQuery選擇器

2023-11-19 21:17:58

GoRust

2009-12-16 14:10:12

路由技術性能比較

2014-08-20 09:49:50

虛擬機Linux Conta

2025-02-12 10:36:06

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧洲亚洲精品久久久久 | 日韩不卡在线 | 欧美久久一区二区 | 中文在线а√在线8 | 九九一级片 | 欧美1区 | 狠狠干狠狠操 | 97国产在线视频 | 国产欧美日韩一区 | 91精品国产综合久久久动漫日韩 | 三级视频网站 | 美女久久 | 国产精品亚洲综合 | 欧美性精品 | 国产精品久久久久久久久久久久久 | 国产精品亚洲综合 | 一区二区三区欧美大片 | 亚洲国产一区二区三区 | 日韩免费福利视频 | 成人免费大片黄在线播放 | 久久99国产精一区二区三区 | 黄色网址在线免费观看 | 亚洲在线电影 | 久久久久久国产精品 | 欧美一级特黄aaa大片在线观看 | 欧美在线视频一区 | 亚洲麻豆| 国产99视频精品免视看9 | 亚洲精品视频在线看 | 日韩美女一区二区三区在线观看 | 蜜臀av日日欢夜夜爽一区 | 一区二区三区视频在线观看 | 欧美精品一| 一本大道久久a久久精二百 欧洲一区二区三区 | 中文字幕在线精品 | 精品久久中文字幕 | 国产片淫级awww | 日韩精品久久 | 亚洲日本视频 | 中国美女一级黄色片 | 久久精品欧美电影 |