版权声明:本文为博主转载文章 https://blog.youkuaiyun.com/u010209217/article/details/84837821
在日常编码中,经常会遇到DO、DTO对象之间的转换,如果对象本身的属性比较少的时候,那么我们采用硬编码手工setter也还ok,但如果对象的属性比较多的情况下,手工setter就显得又low又效率又低。这个时候我们就考虑采用一些工具类来进行对象属性的拷贝了。
我们常用的对象属性拷贝的方式有:
Hard Code
net.sf.cglib.beans.BeanCopier#copy
org.springframework.beans.BeanUtils.copyProperties
org.apache.commons.beanutils.PropertyUtils.copyProperties
org.apache.commons.beanutils.BeanUtils.copyProperties
针对以上的拷贝方式,我做了一个简单的性能测试,结果如下:
拷贝方式 | 对象数量: 1 | 对象数量: 1000 | 对象数量: 100000 | 对象数量: 1000000 |
---|---|---|---|---|
Hard Code | 0 ms | 1 ms | 18 ms | 43 ms |
cglib.BeanCopier | 111 ms | 117 ms | 107 ms | 110 ms |
spring.BeanUtils | 116 ms | 137 ms | 246 ms | 895 ms |
apache.PropertyUtils | 167 ms | 212 ms | 601 ms | 7869 ms |
apache.BeanUtils | 167 ms | 275 ms | 1732 ms | 12380 ms |
测试环境:OS=
macOS 10.14
, CPU=2.5 GHz,Intel Core I7
, Memory=16 GB, 2133MHz LPDDR3
测试方法:通过copy指定数量的复杂对象,分别执行每个Case
10
次,取其平均值
版本:commons-beanutils:commons-beanutils:1.9.3
,org.springframework:spring-beans:4.3.5.RELEASE
,cglib:cglib:2.2.2
结论:从测试结果中很明显可以看出采用Hard Code
方式进行对象属性Copy性能最佳;采用net.sf.cglib.beans.BeanCopier#copy
方式进行对象属性copy性能最稳定;而org.apache.commons.beanutils.BeanUtils.copyProperties
方式在数据量大时性能下降最厉害。所以在日常编程中遇到具有较多属性的对象进行属性复制时优先考虑采用net.sf.cglib.beans.BeanCopier#copy
。
以上的数据之所产生巨大差距的原因在于其实现原理与方式的不同而导致的,Hard Code直接调用getter & setter
方法值,cglib
采用的是字节码技术
,而后三种均采用反射
的方式。
-
属性copy时各方式的使用场景:
- 对性能要求较高的时候,推荐采用手工方法调用
- 一般场景推荐使用
net.sf.cglib.beans.BeanCopier#copy
- 如果考虑到引入新jar包的风险时,推荐使用
org.springframework.beans.BeanUtils.copyProperties