Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils、Spring BeanUtils、Cglib BeanCopier)
文章转载自:Bean复制的几种框架性能比较
Bean复制的几种框架性能比较:
测试结果:
10次测验 | 第一次 | 第二次 | 第三次 | 平均值 | 每次平均值 |
---|---|---|---|---|---|
BeanUtil.copyProperties | 54 | 57 | 50 | 53.66667 | 5.366666667 |
PropertyUtils.copyProperties | 4 | 4 | 4 | 4 | 0.4 |
org.springframework.beans.BeanUtils.copyProperties | 12 | 10 | 11 | 11 | 1.1 |
BeanCopier.create | 0 | 0 | 0 | 0 | 0 |
10000次测验 | 第一次 | 第二次 | 第三次 | 平均值 | 每次平均值 |
---|---|---|---|---|---|
BeanUtil.copyProperties | 241 | 222 | 226 | 229.6667 | 0.022966667 |
PropertyUtils.copyProperties | 92 | 90 | 92 | 91.33333 | 0.009133333 |
org.springframework.beans.BeanUtils.copyProperties | 29 | 30 | 32 | 30.33333 | 0.003033333 |
BeanCopier.create | 1 | 1 | 1 | 1 | 0.1 |
10000次反转测验 | 第一次 | 第二次 | 第三次 | 平均值 | 每次平均值 |
---|---|---|---|---|---|
BeanUtil.copyProperties | 178 | 174 | 178 | 176.6667 | 0.017666667 |
PropertyUtils.copyProperties | 91 | 87 | 89 | 89 | 0.0089 |
org.springframework.beans.BeanUtils.copyProperties | 21 | 21 | 21 | 21 | 0.0021 |
BeanCopier.create | 0 | 1 | 1 | 0.666667 | 6.66667E-05 |
注意:Cglib在测试的时候,先进行了实例的缓存,这个也是他性能较好的原因之一。如果把缓存去掉的话,性能就会出现了一些的差异,但是整体的性能还是很好,不过奇怪的是10000次反而比10次少,而且后面的反转1万次反而耗时最少,进行多次测试效果也是如此。
从整体的表现来看:
- Cglib的BeanCopier的性能是最好的无论是数量较大的1万次的测试,还是数量较少10次,几乎都是趋近与零损耗。
- Spring是在次数增多的情况下,性能较好,在数据较少的时候,性能比PropertyUtils的性能差一些。
- PropertyUtils的性能相对稳定,表现是呈现线性增长的趋势。
- 而Apache的BeanUtil的性能最差,无论是单次Copy还是大数量的多次Copy性能都不是很好
测验次数 | 10次 | 10000次 | 10000次反转 |
---|---|---|---|
BeanCopier.create | 41 | 28 | 10 |
cglib BeanCopier 使用小探究:
- cglib是一款比较底层的操作java字节码的框架,其特性包括:
- 属性名称、类型都相同:拷贝OK
- 属性名称相同、类型不同:名称相同而类型不同的属性不会被拷贝
注意:即使源类型是原始类型(int, short和char等),目标类型是其包装类型(Integer, Short和Character等),或反之:都不会被拷贝。 - 源类和目标类有相同的属性(两者的getter都存在),但目标类的setter不存在 : 创建BeanCopier的时候抛异常。
网上很多文章说是这里抛得异常:
我信你个鬼,糟老头子
Debug追踪看一下代码执行过程,根本就没有执行generateClass方法中的代码呢(如果写错了,欢迎大家来吐槽,一起分析),也没有抛空指针异常,难道版本不一样吗!
- 源类或目标类的setter比getter少 : 拷贝OK。此时的setter多余,但不会报错。
当源和目标类的属性类型不同时,不能拷贝该属性,此时我们可以通过实现Converter接口来自定义转换器:
直接上代码吧:
package com.pica.cloud.patient.resident.server;/*** @ClassName TargetClazz* @Description 目标类* @Author Chongwen.jiang* @Date 2019/7/25 17:18* @ModifyDate 2019/7/25 17:18* @Version 1.0*/
public class TargetClazz {private Integer id;private String name;private String createTime;public Integer getId() {return id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCreateTime() {return createTime;}public void setCreateTime(String createTime) {this.createTime = createTime;}public void setId(Integer id) {this.id = id;}
}
package com.pica.cloud.patient.resident.server;import java.sql.Timestamp;/*** @ClassName SourceClazz* @Description 源类* @Author Chongwen.jiang* @Date 2019/7/25 17:17* @ModifyDate 2019/7/25 17:17* @Version 1.0*/
public class SourceClazz {private Integer id;private String name;private Timestamp createTime;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Timestamp getCreateTime() {return createTime;}public void setCreateTime(Timestamp createTime) {this.createTime = createTime;}
}
package com.pica.cloud.patient.resident.server;import org.springframework.cglib.core.Converter;import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;/*** @ClassName AccountConverter* @Description Bean属性类型转换器* @Author Chongwen.jiang* @Date 2019/7/25 17:56* @ModifyDate 2019/7/25 17:56* @Version 1.0*/
public class TypeConverter implements Converter {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Overridepublic Object convert(Object value, Class target, Object o1) {if (value instanceof Integer) {return (Integer) value;} else if (value instanceof Timestamp) {Timestamp date = (Timestamp) value;return sdf.format(date);} else if (value instanceof BigDecimal) {BigDecimal bd = (BigDecimal) value;return bd.toPlainString();}return null;}
}
package com.pica.cloud.patient.resident.server;import com.alibaba.fastjson.JSON;
import com.pica.cloud.patient.resident.server.mapper.WechatUserMapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.test.context.junit4.SpringRunner;import java.sql.Timestamp;/*** @ClassName DbTest* @Description 测试类* @Author Jun.li0101* @Date 2019/3/21 13:25* @ModifyDate 2019/3/21 13:25* @Version 1.0*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class DbTest {@Autowiredprivate WechatUserMapper wechatUserMapper;@Testpublic void test1() {SourceClazz sourceClazz = new SourceClazz();sourceClazz.setId(12);sourceClazz.setName("loname");sourceClazz.setCreateTime(Timestamp.valueOf("2019-07-25 15:54:23"));final BeanCopier a = BeanCopier.create(SourceClazz.class, TargetClazz.class, true);TargetClazz targetClazz = new TargetClazz();TypeConverter typeConvert = new TypeConverter();a.copy(sourceClazz, targetClazz, typeConvert);System.out.println(JSON.toJSONString(targetClazz));Assert.assertEquals("2019-07-25 15:54:23", targetClazz.getCreateTime());}
}
注:一旦使用Converter,BeanCopier只使用Converter定义的规则去拷贝属性,所以在convert方法中要考虑所有的属性。
Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils、Spring BeanUtils、Cglib BeanCopier)相关推荐
- Bean复制的几种框架性能比较(BeanUtils、PropertyUtils、BeanCopier)
作者:费晓晖 cnblogs.com/kaka/archive/2013/03/06/2945514.html 作为一个新员工,一个首要的工作就是阅读别人的代码,阅读代码的诸多好处就不说了,我就直奔主 ...
- 心酸 | Bean复制的几种框架对比,看完心酸
Hi! 我是小小,今天是本周的第三篇,本篇将会着重对比Bean框架的复制效率, 正文 作为一个员工,最重要的不是编写代码,而是阅读代码,本博主在阅读代码的时候,发现几种实现两个不同类型的Bean的差异 ...
- 对象拷贝 Apache BeanUtils与Spring BeanUtils性能比较
前言 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进 ...
- java bean 优缺点_Java Bean Copy框架性能对比
一.问题分析 背景 相同server机器上的相同方法在方法调用链任何参数都一致的情况消耗时间差别非常大,举例说明,类A有方法demo(), 通过分析发现同一台机器(也是一个jvm进程)对该方法的两次调 ...
- 几种流行Webservice框架性能对比
1 摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有30多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性 ...
- 几种流行Webservice框架性能对照
转自[http://blog.csdn.net/thunder4393/article/details/5787121],写的非常好,以收藏. 1 摘要 开发webservice应用程序中 ...
- 对象复制的7种方法,还是Spring的最好用!
日常编程中,我们会经常会碰到对象属性复制的场景,就比如下面这样一个常见的三层 MVC 架构. 当我们在上面的架构下编程时,我们通常需要经历对象转化,将业务请求流程经历三层机构后需要把 DTO 转为DO ...
- 帮助 Java 开发人员进行 Bean 映射的 8 大框架
文章目录 什么是 JavaBean? 什么是 Bean 映射框架? Java 中用于映射的顶级框架 **dOOv** **映射器** **地图结构** **模型映射器** **重映射** **折花** ...
- 进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式
进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式 优知学院 2018-09-05 07:21:00 1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大 ...
- 【ELT.ZIP】OpenHarmony啃论文俱乐部——大数据框架性能优化系统
本文出自ELT.ZIP团队,ELT<=>Elite(精英),.ZIP为压缩格式,ELT.ZIP即压缩精英. 成员: 上海工程技术大学大二在校生 合肥师范学院大二在校生 清华大学大二在校生 ...
最新文章
- excel去掉超链接
- MySql入门笔记二~悲催的用户
- 查看oracle所有实例_Oracle目录结构与系统用户-数据库(3)
- 【GAN优化】如何选好正则项让你的GAN收敛
- How is a Batch request handled in the backend
- 160 - 5 ajj.2
- 定义一个Matrix类,实现矩阵的加法和乘法
- CVPR 2020丨微软亚洲研究院精选论文一览
- 视频会议平台Zoom市值近1200亿美元,投资人李嘉诚赚翻了
- UI设计干货素材|动态交互插画模板
- 通过git命令将本地代码文件推送至github
- 社工手段日益精进,MacOS和IOS系统还安全吗?
- button组件 untiy_Unity 3D Button控件
- 基于 KubeSphere 的分级管理实践
- 私网ip和公网ip_详解
- MATLAB中round函数的使用
- 如何把语音转文字转换
- STM32 IIC通信简介+PCF8563时钟芯片示例
- 服务器维护实用工具(Unicode)版本,修复SQL Server 2000数据库之实战经验
- Windows 和 Linux 系统查询 IP 地址命令