公司系统中以前一直有使用组件进行Bean copy的操做,只是知道此操做对性能有影响,可是到底有多少影响内心一直没有数。如今对Bean copy进行测试获取量化的结果java
目前Bean Copy的主流组件:spring
Apache BeanUtils缓存
Spring BeanUtilsbash
Cglib BeanCopier多线程
众所周知Apache BeanUtils性能太差,通常不推荐使用。这里不对其进行测试,只测试后面两个组件app
测试功能:循环N次,将TelAppModel 对象中的属性复制到TelAppDto中,统计每种组件花费的时间,花费时间越少的性能越强。oop
测试POJO类 源类 TelAppModel.java 和目标类 TelAppDto.java,两个类都是简单的pojo类且成员变量相同。性能
普通的Java set/get方法实现Bean Copy, 代码以下:测试
public static void copySetGet(TelAppModel source, TelAppDto target){
target.setId(source.getId());
target.setTelPowerSavingMode((byte)0);
target.setTelSecret(source.getTelSecret());
target.setTelAppId(source.getTelAppId());
target.setTelName(source.getTelName());
target.setDesc(source.getDesc());
}
复制代码
Spring BeanUtils实现Bean Copy代码以下:优化
public static void copyPropertiesSpring(Object source, Object target){
BeanUtils.copyProperties(source, target);
}
复制代码
Cglib BeanCopier实现Bean Copy代码以下:
public static void copyPropertiesCglib(Object source, Object target){
BeanCopier beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
beanCopier.copy(source, target, null);
}
复制代码
测试代码: longCount:定义复制执行的次数
// 在执行Bean copy前 先初始化 longCount 个TelAppModel,作为测试素材
for(int i = 0; i < longCount; i++){
appModelSourceList.add(createModel());
}
复制代码
3种Bean copy方法依次调用此test()方法:
// set/get方法
test((a,b) -> copySetGet(a, b));
// spring BeanUtils
test((a,b) -> copyPropertiesSpring(a, b));
// spring BeanCopier
test((a,b) -> copyPropertiesCglib(a, b));
复制代码
// 此方法依次将列表中TelAppModel对象复制到TelAppDto对象中,并打印执行longCount次花费的时间,为了保证结果准确,以上操做执行3次,即3*longCount次
private void test(BiConsumer<TelAppModel, TelAppDto> biConsumer){
int runNum = 3;
for(int k = 0; k < runNum; k++) {
long loopCount = longCount;
long begin = System.currentTimeMillis();
for (int i = 0; i < loopCount; i++) {
TelAppModel telAppModel1 = appModelSourceList.get(i);
TelAppDto telAppDto = new TelAppDto();
biConsumer.accept(telAppModel1, telAppDto);
}
System.out.println((System.currentTimeMillis() - begin));
}
}
复制代码
分别执行1000、10000、100000、1000000次耗时数(毫秒): 详细时间以下:
在执行命令时,经过jvisualvm查看CPU的耗时时间,详细以下:
static BeanCopier beanCopierStatic = BeanCopier.create(TelAppModel.class, TelAppDto.class, false);
public static void copyPropertiesCglibStatic(Object source, Object target){
beanCopierStatic.copy(source, target, null);
}
复制代码
再分别执行1000、10000、100000、1000000次耗时数(毫秒): 详细时间以下:
分析: Cglib BeanCopier优化,性能大大提升。cglib在性能和set/get方法相差不大
spring beanUtils 和 cglib 性能都还能够接受,若是对性能没有很是苛刻的要求,使用cglib或spring bean utils 问题都问题不大,推荐优先使用cglib
复制代码