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

Bean復(fù)制的幾種框架對(duì)比,看完心酸

開發(fā) 架構(gòu)
作為一個(gè)員工,最重要的不是編寫代碼,而是閱讀代碼,本博主在閱讀代碼的時(shí)候,發(fā)現(xiàn)幾種實(shí)現(xiàn)兩個(gè)不同類型的Bean的差異,本著研究的精神,仔細(xì)對(duì)比了Bean復(fù)制的性能差異。

[[375476]]

本文轉(zhuǎn)載自微信公眾號(hào)「小明菜市場(chǎng)」,作者小明菜市場(chǎng) 。轉(zhuǎn)載本文請(qǐng)聯(lián)系小明菜市場(chǎng)公眾號(hào)。

正文

作為一個(gè)員工,最重要的不是編寫代碼,而是閱讀代碼,本博主在閱讀代碼的時(shí)候,發(fā)現(xiàn)幾種實(shí)現(xiàn)兩個(gè)不同類型的Bean的差異,本著研究的精神,仔細(xì)對(duì)比了Bean復(fù)制的性能差異。

比較的框架分別是Apache的BeanUtils,PropertyUtils,Spring的,BeanUtils,Cglib的BeanCopier。

做法是在idea新建了一個(gè)Project,專門用于專門測(cè)試幾種代碼的性能。具體的代碼如下:一個(gè)FromBean和一個(gè)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.   
  8.     public double getMoney() { 
  9.         return money; 
  10.     } 
  11.   
  12.     public void setMoney(double money) { 
  13.         this.money = money; 
  14.     } 
  15.   
  16.     public String getName() { 
  17.         return name
  18.     } 
  19.   
  20.     public void setName(String name) { 
  21.         this.name = name
  22.     } 
  23.   
  24.     public int getAge() { 
  25.         return age; 
  26.     } 
  27.   
  28.     public void setAge(int age) { 
  29.         this.age = age; 
  30.     } 
  31.   
  32.     public String getAddress() { 
  33.         return address; 
  34.     } 
  35.   
  36.     public void setAddress(String address) { 
  37.         this.address = address; 
  38.     } 
  39.   
  40.     public String getIdno() { 
  41.         return idno; 
  42.     } 
  43.   
  44.     public void setIdno(String idno) { 
  45.         this.idno = idno; 
  46.     } 
  47.   

一個(gè)用于測(cè)試的BenchmarkTest類

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

對(duì)接口的聲明

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

使用的測(cè)試類

  1. public class TestMain { 
  2.  
  3.     /** 
  4.      * @param args 
  5.      */ 
  6.     public static void main(String[] args) { 
  7.         FromBean fb = new FromBean(); 
  8.         fb.setAddress("北京市朝陽區(qū)大屯路"); 
  9.         fb.setAge(20); 
  10.         fb.setMoney(30000.111); 
  11.         fb.setIdno("110330219879208733"); 
  12.         fb.setName("測(cè)試"); 
  13.  
  14.         IMethodCallBack beanutilCB = new IMethodCallBack() { 
  15.  
  16.             @Override 
  17.             public String getMethodName() { 
  18.                 return "BeanUtil.copyProperties"
  19.             } 
  20.  
  21.             @Override 
  22.             public ToBean callMethod(FromBean frombean) throws Exception { 
  23.  
  24.                 ToBean toBean = new ToBean(); 
  25.                 BeanUtils.copyProperties(toBean, frombean); 
  26.                 return toBean; 
  27.             } 
  28.         }; 
  29.  
  30.         IMethodCallBack propertyCB = new IMethodCallBack() { 
  31.  
  32.             @Override 
  33.             public String getMethodName() { 
  34.                 return "PropertyUtils.copyProperties"
  35.             } 
  36.  
  37.             @Override 
  38.             public ToBean callMethod(FromBean frombean) throws Exception { 
  39.                 ToBean toBean = new ToBean(); 
  40.                 PropertyUtils.copyProperties(toBean, frombean); 
  41.                 return toBean; 
  42.             } 
  43.         }; 
  44.  
  45.         IMethodCallBack springCB = new IMethodCallBack() { 
  46.  
  47.             @Override 
  48.             public String getMethodName() { 
  49.                 return "org.springframework.beans.BeanUtils.copyProperties"
  50.             } 
  51.  
  52.             @Override 
  53.             public ToBean callMethod(FromBean frombean) throws Exception { 
  54.                 ToBean toBean = new ToBean(); 
  55.                 org.springframework.beans.BeanUtils.copyProperties(frombean, 
  56.                         toBean); 
  57.                 return toBean; 
  58.             } 
  59.         }; 
  60.  
  61.         IMethodCallBack cglibCB = new IMethodCallBack() { 
  62.             BeanCopier bc = BeanCopier.create(FromBean.class, ToBean.class, 
  63.                     false); 
  64.  
  65.             @Override 
  66.             public String getMethodName() { 
  67.                 return "BeanCopier.create"
  68.             } 
  69.  
  70.             @Override 
  71.             public ToBean callMethod(FromBean frombean) throws Exception { 
  72.                 ToBean toBean = new ToBean(); 
  73.                 bc.copy(frombean, toBean, null); 
  74.                 return toBean; 
  75.             } 
  76.         }; 
  77.  
  78.         // 數(shù)量較少的時(shí)候,測(cè)試性能 
  79.         BenchmarkTest bt = new BenchmarkTest(10); 
  80.         bt.benchmark(beanutilCB, fb); 
  81.         bt.benchmark(propertyCB, fb); 
  82.         bt.benchmark(springCB, fb); 
  83.         bt.benchmark(cglibCB, fb); 
  84.  
  85.         // 測(cè)試一萬次性能測(cè)試 
  86.         BenchmarkTest bt10000 = new BenchmarkTest(10000); 
  87.         bt10000.benchmark(beanutilCB, fb); 
  88.         bt10000.benchmark(propertyCB, fb); 
  89.         bt10000.benchmark(springCB, fb); 
  90.         bt10000.benchmark(cglibCB, fb); 
  91.  
  92.         // 擔(dān)心因?yàn)轫樞騿栴}影響測(cè)試結(jié)果 
  93.         BenchmarkTest bt1000R = new BenchmarkTest(10000); 
  94.         bt1000R.benchmark(cglibCB, fb); 
  95.         bt1000R.benchmark(springCB, fb); 
  96.         bt1000R.benchmark(propertyCB, fb); 
  97.         bt1000R.benchmark(beanutilCB, fb); 
  98.  
  99.     } 
  100.  

測(cè)試的結(jié)果如下

不過需要注意的是,Cglib在測(cè)試的時(shí)候,先進(jìn)行了實(shí)例的緩存,這個(gè)也是他性能較好的原因之一。如果把緩存去掉的話,性能就會(huì)出現(xiàn)了一些的差異,但是整體的性能還是很好, 從整體的表現(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性能都不是很好。

 

責(zé)任編輯:武曉燕 來源: 小明菜市場(chǎng)
相關(guān)推薦

2021-01-11 14:16:19

Bean代碼Java

2017-11-15 08:52:18

軟件硬件復(fù)制

2020-06-02 14:45:48

PostgreSQL架構(gòu)分布式

2022-05-27 08:25:55

容器Spring

2022-05-12 09:37:03

測(cè)試JUnit開發(fā)

2022-03-16 11:11:37

SpringBean項(xiàng)目

2019-12-25 09:53:01

虛擬機(jī)技術(shù)固態(tài)硬盤

2023-02-17 18:06:33

微服務(wù)架構(gòu)

2019-08-23 10:10:58

Nginx反向代理防盜鏈

2017-07-14 14:50:00

架構(gòu)框架前端

2017-06-27 14:02:09

前端框架Bootstrap

2019-03-06 09:55:54

Python 開發(fā)編程語言

2012-07-06 09:59:09

iOS 6Android 4.1

2010-09-01 16:07:25

無線局域網(wǎng)

2013-05-27 10:21:19

2025-01-08 08:30:38

2009-02-01 09:29:44

2012-05-30 13:25:00

2016-12-08 16:03:52

性能穩(wěn)定性

2021-04-24 07:50:59

壓縮軟件電腦
點(diǎn)贊
收藏

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