Hi! 我是小小,今天是本周的第三篇,本篇将会着重对比Bean框架的复制效率,

正文

作为一个员工,最重要的不是编写代码,而是阅读代码,本博主在阅读代码的时候,发现几种实现两个不同类型的Bean的差异,本着研究的精神,仔细对比了Bean复制的性能差异。

比较的框架分别是Apache的BeanUtils,PropertyUtils,Spring的,BeanUtils,Cglib的BeanCopier。

做法是在idea新建了一个Project,专门用于专门测试几种代码的性能。具体的代码如下:一个FromBean和一个ToBean。

public class FromBean {private String name;private int age;private String address;private String idno;private double money;public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getIdno() {return idno;}public void setIdno(String idno) {this.idno = idno;}}

一个用于测试的BenchmarkTest类

public class BenchmarkTest {private int count;public BenchmarkTest(int count) {this.count = count;System.out.println("性能测试" + this.count + "==================");}public void benchmark(IMethodCallBack m, FromBean frombean) {try {long begin = new java.util.Date().getTime();ToBean tobean = null;System.out.println(m.getMethodName() + "开始进行测试");for (int i = 0; i < count; i++) {tobean = m.callMethod(frombean);}long end = new java.util.Date().getTime();System.out.println(m.getMethodName() + "耗时" + (end - begin));System.out.println(tobean.getAddress());System.out.println(tobean.getAge());System.out.println(tobean.getIdno());System.out.println(tobean.getMoney());System.out.println(tobean.getName());System.out.println("                                      ");} catch (Exception e) {e.printStackTrace();}}
}

对接口的声明

public interface IMethodCallBack {String getMethodName();ToBean callMethod(FromBean frombean)  throws Exception;}

使用的测试类

public class TestMain {/*** @param args*/public static void main(String[] args) {FromBean fb = new FromBean();fb.setAddress("北京市朝阳区大屯路");fb.setAge(20);fb.setMoney(30000.111);fb.setIdno("110330219879208733");fb.setName("测试");IMethodCallBack beanutilCB = new IMethodCallBack() {@Overridepublic String getMethodName() {return "BeanUtil.copyProperties";}@Overridepublic ToBean callMethod(FromBean frombean) throws Exception {ToBean toBean = new ToBean();BeanUtils.copyProperties(toBean, frombean);return toBean;}};IMethodCallBack propertyCB = new IMethodCallBack() {@Overridepublic String getMethodName() {return "PropertyUtils.copyProperties";}@Overridepublic ToBean callMethod(FromBean frombean) throws Exception {ToBean toBean = new ToBean();PropertyUtils.copyProperties(toBean, frombean);return toBean;}};IMethodCallBack springCB = new IMethodCallBack() {@Overridepublic String getMethodName() {return "org.springframework.beans.BeanUtils.copyProperties";}@Overridepublic ToBean callMethod(FromBean frombean) throws Exception {ToBean toBean = new ToBean();org.springframework.beans.BeanUtils.copyProperties(frombean,toBean);return toBean;}};IMethodCallBack cglibCB = new IMethodCallBack() {BeanCopier bc = BeanCopier.create(FromBean.class, ToBean.class,false);@Overridepublic String getMethodName() {return "BeanCopier.create";}@Overridepublic ToBean callMethod(FromBean frombean) throws Exception {ToBean toBean = new ToBean();bc.copy(frombean, toBean, null);return toBean;}};// 数量较少的时候,测试性能BenchmarkTest bt = new BenchmarkTest(10);bt.benchmark(beanutilCB, fb);bt.benchmark(propertyCB, fb);bt.benchmark(springCB, fb);bt.benchmark(cglibCB, fb);// 测试一万次性能测试BenchmarkTest bt10000 = new BenchmarkTest(10000);bt10000.benchmark(beanutilCB, fb);bt10000.benchmark(propertyCB, fb);bt10000.benchmark(springCB, fb);bt10000.benchmark(cglibCB, fb);// 担心因为顺序问题影响测试结果BenchmarkTest bt1000R = new BenchmarkTest(10000);bt1000R.benchmark(cglibCB, fb);bt1000R.benchmark(springCB, fb);bt1000R.benchmark(propertyCB, fb);bt1000R.benchmark(beanutilCB, fb);}}

测试的结果如下不过需要注意的是,Cglib在测试的时候,先进行了实例的缓存,这个也是他性能较好的原因之一。如果把缓存去掉的话,性能就会出现了一些的差异,但是整体的性能还是很好,  从整体的表现来看,Cglib的BeanCopier的性能是最好的无论是数量较大的1万次的测试,还是数量较少10次,几乎都是趋近与零损耗,Spring是在次数增多的情况下,性能较好,在数据较少的时候,性能比PropertyUtils的性能差一些。PropertyUtils的性能相对稳定,表现是呈现线性增长的趋势。而Apache的BeanUtil的性能最差,无论是单次Copy还是大数量的多次Copy性能都不是很好。

关于作者

我是小小,双鱼座的程序猿,我们下期再见~bye

END

「 往期文章 」

线程安全 | i++线程安全?真相是这样……

够狠 | 单点登录三种方式,够狠!够劲爆!

大礼包 | 来拿小程序大礼包啦!

扫描二维码

获取更多精彩

小明菜市场

来源:网络(侵删)

图片来源:网络(侵删)

点个在看你最好看

心酸 | Bean复制的几种框架对比,看完心酸相关推荐

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

    作者:费晓晖 cnblogs.com/kaka/archive/2013/03/06/2945514.html 作为一个新员工,一个首要的工作就是阅读别人的代码,阅读代码的诸多好处就不说了,我就直奔主 ...

  2. Storm与Spark、Hadoop三种框架对比

    目录 Storm与Spark.Hadoop三种框架对比 一.Storm与Spark.Hadoop三种框架对比 二.hadoop的应用业务分析 二.浅谈Hadoop的基本原理 Hadoop与Storm的 ...

  3. 白话23 种设计模式,看完秒懂!

    你知道的越多,不知道的就越多,业余的像一棵小草! 成功路上并不拥挤,因为坚持的人不多. 编辑:业余草 zhuanlan.zhihu.com/p/100746724 推荐:https://www.xtt ...

  4. 用追女孩子的故事通俗解释 23 种设计模式,看完秒懂!

    >>号外:关注"Java精选"公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料.开源项目. 设计模式有两种分类方法,即根据模式的目的来分和根据模式 ...

  5. 流式大处理的三种框架对比:Storm,Spark和Flink

    storm.spark streaming.flink都是开源的分布式系统,具有低延迟.可扩展和容错性诸多优点,允许你在运行数据流代码时,将任务分配到一系列具有容错能力的计算机上并行运行,都提供了简单 ...

  6. 前端流行使用的五种框架对比

    web前端开发并不难,但是要想做得优雅的前端并不容易,而前端框架模块规范化的开发提高了效率,前端框架的出现让前端开发更为便捷.简单.快速.随着jQuery及css3的发展,以Bootstrap 为代表 ...

  7. 前端启动本地服务的四种方法,看完不会你锤我

    前边几篇文章介绍本地缓存,还有 WebSocket 等好多需要在服务内才能运行,上一篇介绍移动端适配,更是需要在手机端访问页面,此时就不得不介绍下如何在本地启动服务,及手机如何访问? 一.为什么需要本 ...

  8. 调用本地html_requests-html:最简单的爬虫框架,看完你就会了

    很多朋友都听说过Python的大名,而Python也拥有众多的爬虫框架,其中最简单的莫过于requests-html了.它和著名的网络请求库requests是同一个作者,着重于XML数据提取,可以说是 ...

  9. 数据管理的3种方法,看完后感叹:数字化转型、数据中台真不难

    结尾给大家整理了超多干货! 企业建立数据中台,是为了能够快速的赋能业务进行落地实施.改造.试错.转型:快速提升组织之间的协同效率,降低系统成本,实现数字化-智能化转型. 当数据汇集之后,企业在做数据治 ...

最新文章

  1. 常见的排序算法(1)
  2. java设计模式观察者模式_Java设计模式(9)——观察者模式
  3. kvm cobbler无人值守批量安装操作系统
  4. java 代码scope注解_Spring学习(15)--- 基于Java类的配置Bean 之 @Bean @Scope 注解
  5. ubuntu下搭建nfs服务器
  6. 下载 Bootstrap3 的 Sass 版本
  7. Introduction to my galaxy engine 8 : Real Time Fluid Rendering
  8. java8 64_【java8下载】Java8最新版下载 64位-七喜软件园
  9. oracle 数据备份视频,赵强老师:Oracle数据库(之四):备份与恢复视频课程
  10. 手动修改Icon图标的颜色深度(张佩)
  11. 如何规范化数据库模型设计
  12. Ipad使用技巧之——打印机
  13. 软考中级网络工程师学习笔记(知识点汇总)详细版本
  14. window10设置系统还原点和使用还原点还原系统
  15. Java操作外部数据源(RDBMS,Hive,HBase)
  16. 事务四大特征:原子性,一致性,隔离性和持久性(ACID)
  17. 随堂笔记4——文本编辑器Vim
  18. 【阿里巴巴大数据实践笔记】第9章:阿里巴巴数据整合及管理体系
  19. 微信errcode大全
  20. ubuntu golang 安装完成报 “command ‘go‘ not found“

热门文章

  1. 算法每日学打卡:01-21打卡(解答后面整理)
  2. 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
  3. 零日攻击的原理与防范方法
  4. 算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)
  5. MacOS Docker版本FastDFS安装指南
  6. [编程题]数独(JAVA)
  7. 无线策略服务器,无线网络中的分布式资源管理策略研究
  8. 一路踩坑构建Dubbo源码
  9. Java集合系列---TreeMap源码解析(巨好懂!!!)
  10. python能查询MySQL视图_python - 在使用Django的视图中,如何从mysql检索数据,并显示它_python_酷徒编程知识库...