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

Bean復制的幾種框架對比,看完心酸

開發 架構
作為一個員工,最重要的不是編寫代碼,而是閱讀代碼,本博主在閱讀代碼的時候,發現幾種實現兩個不同類型的Bean的差異,本著研究的精神,仔細對比了Bean復制的性能差異。

[[375476]]

本文轉載自微信公眾號「小明菜市場」,作者小明菜市場 。轉載本文請聯系小明菜市場公眾號。

正文

作為一個員工,最重要的不是編寫代碼,而是閱讀代碼,本博主在閱讀代碼的時候,發現幾種實現兩個不同類型的Bean的差異,本著研究的精神,仔細對比了Bean復制的性能差異。

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

做法是在idea新建了一個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.   
  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.   

一個用于測試的BenchmarkTest類

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

對接口的聲明

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

使用的測試類

  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("北京市朝陽區大屯路"); 
  9.         fb.setAge(20); 
  10.         fb.setMoney(30000.111); 
  11.         fb.setIdno("110330219879208733"); 
  12.         fb.setName("測試"); 
  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.         // 數量較少的時候,測試性能 
  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.         // 測試一萬次性能測試 
  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.         // 擔心因為順序問題影響測試結果 
  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.  

測試的結果如下

不過需要注意的是,Cglib在測試的時候,先進行了實例的緩存,這個也是他性能較好的原因之一。如果把緩存去掉的話,性能就會出現了一些的差異,但是整體的性能還是很好, 從整體的表現來看,Cglib的BeanCopier的性能是最好的無論是數量較大的1萬次的測試,還是數量較少10次,幾乎都是趨近與零損耗,Spring是在次數增多的情況下,性能較好,在數據較少的時候,性能比PropertyUtils的性能差一些。PropertyUtils的性能相對穩定,表現是呈現線性增長的趨勢。而Apache的BeanUtil的性能最差,無論是單次Copy還是大數量的多次Copy性能都不是很好。

 

責任編輯:武曉燕 來源: 小明菜市場
相關推薦

2021-01-11 14:16:19

Bean代碼Java

2017-11-15 08:52:18

軟件硬件復制

2020-06-02 14:45:48

PostgreSQL架構分布式

2022-05-12 09:37:03

測試JUnit開發

2022-05-27 08:25:55

容器Spring

2022-03-16 11:11:37

SpringBean項目

2019-12-25 09:53:01

虛擬機技術固態硬盤

2019-08-23 10:10:58

Nginx反向代理防盜鏈

2017-07-14 14:50:00

架構框架前端

2023-02-17 18:06:33

微服務架構

2019-03-06 09:55:54

Python 開發編程語言

2017-06-27 14:02:09

前端框架Bootstrap

2013-05-27 10:21:19

2012-07-06 09:59:09

iOS 6Android 4.1

2010-09-01 16:07:25

無線局域網

2025-01-08 08:30:38

2012-05-30 13:25:00

2016-12-08 16:03:52

性能穩定性

2021-04-24 07:50:59

壓縮軟件電腦

2009-02-01 09:29:44

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩一区二区免费视频 | 国产精品九九九 | 农夫在线精品视频免费观看 | 91不卡在线 | 一区二区三区国产 | 亚洲 欧美 综合 | 91国产在线播放 | 国产一区亚洲 | 精品欧美一区二区三区久久久 | 日韩另类视频 | 在线观看成年视频 | www九色| 日本成人在线免费视频 | 日韩一区二区三区精品 | 黄毛片| 精品久久精品 | 亚洲一区精品视频 | 天天爱天天操 | 日日干日日操 | 日本不卡一二三 | 日韩乱码在线 | 亚洲精品视频在线 | 国产乱码精品1区2区3区 | 日韩久久综合 | 成人在线视频免费看 | 激情国产在线 | 在线视频成人 | 久久青青 | 国产男女视频网站 | 一级片免费视频 | 免费中文字幕日韩欧美 | 亚洲一区 中文字幕 | 成人h电影在线观看 | 九色在线视频 | 一区二区三区高清在线观看 | 色综合久久88色综合天天 | 欧美午夜一区二区三区免费大片 | 久久夜色精品国产 | 美女天堂 | www.国产视频 | 国产精品久久国产精品久久 |