一、背景
在开发过程中,我们经常会遇到对象的转换,比如外部的 DTO 对象转换为内部的 DO 对象,这里面很多字段名都是相等的,要是一个一个去 get/set 很多人会觉得很烦,于是为了方便和代码的简介大家不约而同地找到了 UtilsBean.copy 相关的对象属性copy工具包。
当我们系统还只是 QPS 几十上百时,可能我们对系统的性能优化还不用到这么细致,当我们的系统 QPS/TPS 达到几十万上百万的时候,UtilsBean.copy 的开销问题就会凸显。
二、Apache、Spring、CGLib、Getter/Setter 属性copy 性能对比
package test.bean.copy;
import net.sf.cglib.beans.BeanCopier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BeanCopyTest {
public static void main(String[] args) throws Exception{
TargetDTO targetDTO = new TargetDTO();
SourceDTO sourceDTO = new SourceDTO();
sourceDTO.setAge(18);
sourceDTO.setName("wenniuwuren");
int totalTimes = 10000;
/**
* Apache BeanUtils
*/
long startTime1 = System.currentTimeMillis();
for (int i = 0; i < totalTimes; i++) {
org.apache.commons.beanutils.BeanUtils.copyProperties(targetDTO, sourceDTO);
}
System.out.println("Apache BeanUtils single thread cost:" + (System.currentTimeMillis() - startTime1) + targetDTO.getName() + targetDTO.getAge());
ExecutorService executorService4 = Executors.n