因为BeanUtils.copyProperties()这个方法的便利,而且实现2个对象的相同字段名称的属性value的拷贝。但是各家的实现算法又是不同的,所以效率也有所差别。测试代码如下:
public void CalEfficence() throws IllegalAccessException, InvocationTargetException{
Long traditionalCopyTime = 0L;
Long springCopyPropertiesTime = 0L;
Long commonsCopyPropertiesTime = 0L;
start = System.currentTimeMillis();
for(int i=0; i<LOOP_NUMBER; i++){
testBean = new TestBean();
testBean.setTestName1("1");
testBean.setTestName2("2");
testBean.setTestName3("3");
testBean.setTestName4("4");
testBean.setTestName5("This is a test");
testBean.setTestName6("testtesttesttesttesttesttesttesttest");
testBean.setTestName7("testtesttesttesttesttesttesttesttest");
testBean.setTestName8("testtesttesttesttesttesttesttesttest");
testBean.setTestName9("testtesttesttesttesttesttesttesttest");
testBean.setTestName10("testtesttesttesttesttesttesttesttest");
testBean.setTestName11("testtesttesttesttesttesttesttesttest");
testBean.setTestName12("testtesttesttesttesttesttesttesttest");
testBean.setTestName13("testtesttesttesttesttesttesttesttest");
testBean.setTestName14("testtesttesttesttesttesttesttesttest");
testBean.setTestName15("testtesttesttesttesttesttesttesttest");
testBean.setTestName16("testtesttesttesttesttesttesttesttest");
testBean.setTestName17("testtesttesttesttesttesttesttesttest");
testBean.setTestName18("testtesttesttesttesttesttesttesttest");
testBean.setTestName19("testtesttesttesttesttesttesttesttest");
testBean.setTestName20("testtesttesttesttesttesttesttesttest");
testBean.setTestName21(new java.util.Date(System.currentTimeMillis()));
testBean.setTestName22(new java.sql.Date(System.currentTimeMillis()));
testBean.setTestName23(2012L);
testBean.setTestName24(3.1415926D);
}
end = System.currentTimeMillis();
traditionalCopyTime = end - start;
TestBean testBean1 = new TestBean();
start = System.currentTimeMillis();
for(int i=0; i<LOOP_NUMBER; i++) {
//copyPerpoties(orig, dest)
org.springframework.beans.BeanUtils.copyProperties(testBean, testBean1);
}
end = System.currentTimeMillis();
springCopyPropertiesTime = end - start;
TestBean testBean2 = new TestBean();
start = System.currentTimeMillis();
for(int i=0; i<LOOP_NUMBER; i++){
//copyPerpoties(dest, orig)
org.apache.commons.beanutils.BeanUtils.copyProperties(testBean2, testBean);
}
end = System.currentTimeMillis();
commonsCopyPropertiesTime = end - start;
System.out.println("循环"+LOOP_NUMBER+"次的结果:");
System.out.println("用Setter方法耗时"+ traditionalCopyTime +"ms");
System.out.println("用Spring的BeanUtils.copyProperties()方法耗时"+springCopyPropertiesTime +"ms");
System.out.println("用Commons包的BeanUtils.copyProperties()方法耗时"+commonsCopyPropertiesTime +"ms");
}
这个是我百度了某位大佬的文章,看到的,觉得很不错,我就记下了。
测试结果:
循环1次的结果:
用Setter方法耗时16ms;
用Spring的BeanUtils.copyProperties()方法耗时266ms;
用Commons包的BeanUtils.copyProperties()方法耗时125ms。
循环10次的结果:
用Setter方法耗时0ms;
用Spring的BeanUtils.copyProperties()方法耗时203ms;
用Commons包的BeanUtils.copyProperties()方法耗时125ms。
循环100次的结果:
用Setter方法耗时0ms;
用Spring的BeanUtils.copyProperties()方法耗时250ms;
用Commons包的BeanUtils.copyProperties()方法耗时218ms。
循环500次的结果:
用Setter方法耗时0ms;
用Spring的BeanUtils.copyProperties()方法耗时266ms;
用Commons包的BeanUtils.copyProperties()方法耗时500ms。
循环5000次的结果:
用Setter方法耗时16ms;
用Spring的BeanUtils.copyProperties()方法耗时421ms;
用Commons包的BeanUtils.copyProperties()方法耗时2829ms。
循环100000次的结果:
用Setter方法耗时78ms;
用Spring的BeanUtils.copyProperties()方法耗时3000ms;
用Commons包的BeanUtils.copyProperties()方法耗时53328ms。
可以看出当循环的次数不太大时(文中小于100次),Commons组件的copyProperties比Spring的copyProperties效率要高;
当循环次数增大时,Commons组件的copyProperties方法的时间开销急剧的增加,达到Spring的copyProperties方法的10倍或更高;
在整个测试过程中,虽然setter代码比较冗长,但效率却一直是最好的,尤其当循环次数增多的时候,它的高效率更完美的体现出来了。