自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 后端
閱讀代碼的諸多好處就不說了,我就直奔主題,通過預(yù)讀代碼,發(fā)現(xiàn)了幾種實(shí)現(xiàn)兩個(gè)不同類型的Bean之間實(shí)現(xiàn)值復(fù)制的幾種方式,上網(wǎng)查詢后發(fā)現(xiàn)性能上會(huì)有差異,于是就萌生自己深入了解幾種實(shí)現(xiàn)的想法。

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

比較的是四種復(fù)制的方式,分別為Apache的BeanUtils和PropertyUtils,Spring的BeanUtils,Cglib的BeanCopier。做法是在Eclipse新建了一個(gè)Project,專門用于專門測(cè)試幾種代碼的性能。具體的代碼如下:

一個(gè)FromBean和一個(gè)ToBean,兩個(gè)的代碼基本上一樣,除了類名稱不一樣,所以只是貼出來了一份。 

  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.     }   

一個(gè)用于測(cè)試的BenchmarkTest類,為了減少重復(fù)代碼,寫了一個(gè)策略模式 

  1. public class BenchmarkTest {  
  2.     private int count;  
  3.     public BenchmarkTest(int count) {  
  4.         this.count = count;  
  5.         System.out.println("性能測(cè)試" + 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() + "開始進(jìn)行測(cè)試");  
  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() + "耗時(shí)" + (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;  

使用的測(cè)試類 

  1. public class TestMain {  
  2.     /**  
  3.      * @param args  
  4.      */  
  5.     public static void main(String[] args) {  
  6.         FromBean fb = new FromBean();  
  7.         fb.setAddress("北京市朝陽區(qū)大屯路");  
  8.         fb.setAge(20);  
  9.         fb.setMoney(30000.111);  
  10.         fb.setIdno("110330219879208733");  
  11.         fb.setName("測(cè)試");  
  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.         // 數(shù)量較少的時(shí)候,測(cè)試性能  
  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.         // 測(cè)試一萬次性能測(cè)試  
  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.         // 擔(dān)心因?yàn)轫樞騿栴}影響測(cè)試結(jié)果  
  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.     }  

進(jìn)行了三次測(cè)試,最后的結(jié)果如下:

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

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

PropertyUtils的性能相對(duì)穩(wěn)定,表現(xiàn)是呈現(xiàn)線性增長(zhǎng)的趨勢(shì)。而Apache的BeanUtil的性能最差,無論是單次Copy還是大數(shù)量的多次Copy性能都不是很好。

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

 

責(zé)任編輯:龐桂玉 來源: Java知音
相關(guān)推薦

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數(shù)據(jù)庫

2012-12-03 10:26:51

Scala

2009-05-25 08:39:08

iPhone蘋果移動(dòng)OS

2020-10-23 07:43:37

Log配置性能

2011-05-18 14:52:04

XML

2009-07-01 18:12:18

JSP的優(yōu)勢(shì)性能比較

2010-03-10 16:35:23

Python編程語言

2011-07-06 14:18:40

Percona SerMySQL

2015-02-05 09:25:51

HTTPSSPDYHTTP2

2020-07-27 08:24:42

編程語言C語言Java

2023-11-20 10:34:09

語言

2023-11-19 21:17:58

GoRust

2009-12-04 19:28:25

FreeBSD 8.0Ubuntu 9.10性能比較

2010-12-27 16:01:45

jQuery選擇器

2009-12-16 14:10:12

路由技術(shù)性能比較

2025-02-12 10:36:06

2014-08-20 09:49:50

虛擬機(jī)Linux Conta
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)