对比BeanUtils、PropertyUtils、BeanCopier的性能消耗

主要代码

定义2个bean对象:

public class copyPropertiesData1 {
private Integer id;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
public class copyPropertiesData2 {
private Integer id;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}

}

  

分别使用BeanUtils、PropertyUtils、BeanCopier转化1000个对象:

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import net.sf.cglib.beans.BeanCopier;
//import org.springframework.beans.BeanUtils;

public class copyPropertiesCompare {
	final static List<copyPropertiesData1> entityList;
	static{
		entityList  = new ArrayList();
        for (int i = 0; i < 10; i++) {
        	copyPropertiesData1 entity = new copyPropertiesData1();
            entityList.add(entity);
        }
	}
	//使用BeanUtils转化1000个对象
	public void test_convert_entity_to_model_performance_use_beanutils() throws IllegalAccessException, InvocationTargetException{
        long start = System.currentTimeMillis();
        List<copyPropertiesData2> modelList = new ArrayList<>();
        for (copyPropertiesData1 src : entityList) {
        	copyPropertiesData2 dest = new copyPropertiesData2();
            BeanUtils.copyProperties(src, dest);
            modelList.add(dest);
        }
        System.out.printf("BeanUtils took time: %d(ms)%n",System.currentTimeMillis() - start);
    }
	
	
	//使用PropertyUtils转化1000个对象
		public void test_convert_entity_to_model_performance_use_PropertyUtils() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
	        long start = System.currentTimeMillis();
	        List<copyPropertiesData2> modelList = new ArrayList<>();
	        for (copyPropertiesData1 src : entityList) {
	        	copyPropertiesData2 dest = new copyPropertiesData2();
	        	PropertyUtils.copyProperties(src, dest);
	            modelList.add(dest);
	        }
	        System.out.printf("PropertyUtils took time: %d(ms)%n",System.currentTimeMillis() - start);
	    }
	
	//使用BeanCopier转化1000个对象
	public void test_convert_entity_to_model_performance_use_beancopier(){
        long start = System.currentTimeMillis();
        BeanCopier b = BeanCopier.create(copyPropertiesData1.class, copyPropertiesData2.class, false);
        List<copyPropertiesData2> modelList = new ArrayList<>();
        for (copyPropertiesData1 src : entityList) {
        	copyPropertiesData2 dest = new copyPropertiesData2();
            b.copy(src, dest, null);
            modelList.add(dest);
        }
        System.out.printf("BeanCopier took time: %d(ms)%n",System.currentTimeMillis() - start);
    }
	
	public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
		copyPropertiesCompare test = new copyPropertiesCompare();
		test.test_convert_entity_to_model_performance_use_beanutils();
//		test.test_convert_entity_to_model_performance_use_PropertyUtils();
//		test.test_convert_entity_to_model_performance_use_beancopier();

	}
}

  

多线程调用:

import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecuteTest {
	public static void main(String[] args){
		BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10, true);
		ExecutorService executorService = new ThreadPoolExecutor(10, 10, 1, TimeUnit.MINUTES, workQueue, new ThreadPoolExecutor.CallerRunsPolicy());
		for(int i=1;i<9999999;i++){
			executorService.execute(new ExecuteTtest());
		}
		executorService.shutdown();
	}
	
	static class ExecuteTtest implements Runnable {

        private ExecuteTtest() {
        }
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
            System.out.println(Thread.currentThread().getName() + " thread start to work");
            copyPropertiesCompare test = new copyPropertiesCompare();
//            test.test_convert_entity_to_model_performance_use_beancopier();
//            test.test_convert_entity_to_model_performance_use_beanutils();
            test.test_convert_entity_to_model_performance_use_PropertyUtils();
        } catch (Exception e) {
            e.printStackTrace();
        }
	}

}
}

  

结果

  • 单笔调用耗时如下:

BeanUtils took time: 110(ms)
PropertyUtils took time: 5(ms)
BeanCopier took time: 75(ms)

  • 并发调用消耗cpu情况

BeanUtils.copyProperties():

PropertyUtils.copyProperties():

cglib beans.BeanCopier():

猜你喜欢

转载自www.cnblogs.com/blackjasmine/p/10264863.html