package jef; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.sql.Timestamp; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; import javax.management.ReflectionException; import jef.accelerator.bean.BeanAccessor; import jef.accelerator.bean.FastBeanWrapperImpl; import jef.accelerator.cglib.beans.BeanCopier; import jef.common.log.LogUtil; import jef.tools.Foo; import jef.tools.reflect.BeanUtils; import jef.tools.reflect.BeanWrapper; import org.apache.commons.lang.builder.ToStringBuilder; import org.junit.Test; public class PerformanceTest { private static final int LOOP_NUMBER = 200000; // copy测试 @Test public void copyPropertiesTest() throws IllegalAccessException, InvocationTargetException, InterruptedException, ReflectionException, NoSuchMethodException { Map<String, Long> cost = new LinkedHashMap<String, Long>(); PromotionPO source = new PromotionPO(); Timestamp now = new Timestamp(System.currentTimeMillis()); source.setCode("code"); source.setDescription("haha"); source.setDiscount(5.4); source.setEndTime(new Date()); source.setID(39578395L); source.setPriority(1); source.setPromotionType(3); source.setStartTime(now); source.setSupplierID("123245L"); source.setField1("dsds"); source.setField2("fdsfsdfds"); source.setField3("sdff33"); source.setField4("dfsef4344"); source.setField5("cfer4344"); source.setField6("dssfsfdsf"); source.setField7("cdedfewfdsf"); { PromotionPO target = new PromotionPO(); BeanCopier bc = BeanCopier.create(PromotionPO.class, PromotionPO.class, false); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { bc.copy(source, target, null); } long endTime = System.currentTimeMillis(); cost.put("Spring BeanCopier", endTime - startTime); } {// 案例0:CGLib (原生) PromotionPO po = new PromotionPO(); jef.accelerator.cglib.beans.BeanCopier bc = jef.accelerator.cglib.beans.BeanCopier.create(PromotionPO.class, PromotionPO.class, false); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { bc.copy(source, po, null); } long endTime = System.currentTimeMillis(); cost.put("CGLib BeanCopier", endTime - startTime); } {// 案例1:Apache commons (最慢) PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { // org.apache.commons.beanutils.PropertyUtils.copyProperties(po, source); } long endTime = System.currentTimeMillis(); cost.put("Apache PropertyUtils", endTime - startTime);// (Apache // 的BeanUtils.copyProperties性能差不多是PropertyUtils的1/2,时间开销加倍实在太慢了!) } {// 案例2:Spring的beanutils // spring PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { org.springframework.beans.BeanUtils.copyProperties(source, po); } long endTime = System.currentTimeMillis(); cost.put("Spring BeanUtils", endTime - startTime); } {// 案例3:Spring的BeanWrapper // spring PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { org.springframework.beans.BeanWrapper bws = new org.springframework.beans.BeanWrapperImpl(source); org.springframework.beans.BeanWrapper bwt = new org.springframework.beans.BeanWrapperImpl(po); for (PropertyDescriptor property : bws.getPropertyDescriptors()) { if(bwt.isWritableProperty(property.getName())){ bwt.setPropertyValue(property.getName(), bws.getPropertyValue(property.getName())); } } } long endTime = System.currentTimeMillis(); cost.put("Spring BeanWrapper", endTime - startTime); } {// 案例4: jef.tools.reflect.BeanUtils (含动态类创建时间) PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { jef.tools.reflect.BeanUtils.copyProperties(source, po); } long endTime = System.currentTimeMillis(); cost.put("Jef BeanUtils(include ASM)", endTime - startTime); } {// 案例5:jef.tools.reflect.BeanUtils BeanAccessor ba = FastBeanWrapperImpl.getAccessorFor(PromotionPO.class); PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); // 动态类生成时间不计入反射操作时间 for (int i = 0; i < LOOP_NUMBER; i++) { ba.copy(source, po); } long endTime = System.currentTimeMillis(); cost.put("Jef BeanAccessor", endTime - startTime); } {// 案例0:直接get/set PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { po.setCode(source.getCode()); po.setDescription(source.getDescription()); po.setDiscount(source.getDiscount()); po.setEndTime(source.getEndTime()); po.setID(source.getID()); po.setPriority(source.getPriority()); po.setPromotionType(source.getPromotionType()); po.setStartTime(source.getStartTime()); po.setSupplierID(source.getSupplierID()); po.setField1(source.getField1()); po.setField2(source.getField2()); po.setField3(source.getField3()); po.setField4(source.getField4()); po.setField5(source.getField5()); po.setField6(source.getField6()); po.setField7(source.getField7()); } long endTime = System.currentTimeMillis(); cost.put("Hard Coding", endTime - startTime); } LogUtil.show(cost); } // 随机存取测试 @Test public void getterSetterTest() throws IllegalAccessException, InvocationTargetException, InterruptedException, ReflectionException, NoSuchMethodException { PromotionPO source = new PromotionPO(); long springCopyPropertiesTime; long commonsCopyPropertiesTime; long fastCopyWithClassGenerate; long fastCopy; long traditionalCopyTIme; {// 案例1:Apache commons PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); // for (int i = 0; i < LOOP_NUMBER; i++) { // org.apache.commons.beanutils.PropertyUtils.getProperty(po, "code"); // org.apache.commons.beanutils.PropertyUtils.getProperty(po, "ID"); // org.apache.commons.beanutils.PropertyUtils.getProperty(po, "field1"); // org.apache.commons.beanutils.PropertyUtils.setProperty(po, "code", "code123456789"); // org.apache.commons.beanutils.PropertyUtils.setProperty(po, "ID", 100L); // org.apache.commons.beanutils.PropertyUtils.setProperty(po, "field1", "field1123456789"); // } long endTime = System.currentTimeMillis(); commonsCopyPropertiesTime = endTime - startTime; } {// 案例2:Spring的beanutils // spring PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { org.springframework.beans.BeanWrapperImpl bw = new org.springframework.beans.BeanWrapperImpl(po); bw.getPropertyValue("code"); bw.getPropertyValue("ID"); bw.getPropertyValue("field1"); bw.setPropertyValue("code", "code123456789"); bw.setPropertyValue("ID", 100L); bw.setPropertyValue("field1", "field1123456789"); } long endTime = System.currentTimeMillis(); springCopyPropertiesTime = endTime - startTime; } {// 案例3: jef.tools.reflect.BeanUtils (含动态类创建时间) PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { jef.tools.reflect.BeanWrapper bw = new FastBeanWrapperImpl(po); bw.getPropertyValue("code"); bw.getPropertyValue("ID"); bw.getPropertyValue("field1"); bw.setPropertyValue("code", "code123456789"); bw.setPropertyValue("ID", 100L); bw.setPropertyValue("field1", "field1123456789"); } long endTime = System.currentTimeMillis(); fastCopyWithClassGenerate = endTime - startTime; } {// 案例4:jef.tools.reflect.BeanUtils PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); // 动态类生成时间不计入反射操作时间 for (int i = 0; i < LOOP_NUMBER; i++) { jef.tools.reflect.BeanWrapper bw = new FastBeanWrapperImpl(po); bw.getPropertyValue("code"); bw.getPropertyValue("ID"); bw.getPropertyValue("field1"); bw.setPropertyValue("code", "code123456789"); bw.setPropertyValue("ID", 100L); bw.setPropertyValue("field1", "field1123456789"); } long endTime = System.currentTimeMillis(); fastCopy = endTime - startTime; } {// 案例0:直接get/set PromotionPO po = new PromotionPO(); long startTime = System.currentTimeMillis(); for (int i = 0; i < LOOP_NUMBER; i++) { po.getCode(); po.getID(); po.getField1(); po.setCode("code123456789"); po.setID(100L); po.setField1("field1123456789"); } long endTime = System.currentTimeMillis(); traditionalCopyTIme = endTime - startTime; } LogUtil.info("Apache Commons get/set Time: " + commonsCopyPropertiesTime + "ms."); LogUtil.info("Spring BeanWrapper get/set Time: " + springCopyPropertiesTime + "ms."); LogUtil.info("Easyframe BeanUtil get/set Time: " + fastCopyWithClassGenerate + "ms."); LogUtil.info("Easyframe BeanUtil get/set Time(without first): " + fastCopy + "ms."); LogUtil.info("Java get/set Time: " + traditionalCopyTIme + "ms."); } @Test public void test3() { BeanWrapper bw = BeanWrapper.wrap(new PromotionPO()); for (String s : bw.getPropertyNames()) { System.out.println(s + ":" + s.hashCode()); } System.out.println(bw.getPropertyNames().size()); } @Test public void sdfsa(){ { BeanAccessor ba=FastBeanWrapperImpl.getAccessorFor(PromotionPO.class); PromotionPO source = new PromotionPO(); Timestamp now = new Timestamp(System.currentTimeMillis()); source.setCode("code"); source.setDescription("haha"); source.setDiscount(5.4); source.setEndTime(new Date()); source.setID(39578395L); source.setPriority(1); source.setPromotionType(3); source.setStartTime(now); source.setSupplierID("123245L"); source.setField1("dsds"); source.setField2("fdsfsdfds"); source.setField3("sdff33"); source.setField4("dfsef4344"); source.setField5("cfer4344"); source.setField6("dssfsfdsf"); source.setField7("cdedfewfdsf"); Map map=ba.convert(source); ba.getAnnotationOnField("code"); ba.getAnnotationOnGetter("code"); ba.getAnnotationOnSetter("code"); PromotionPO source2=(PromotionPO)ba.fromMap(map); System.out.println(map); System.out.println(ToStringBuilder.reflectionToString(source)); System.out.println(ToStringBuilder.reflectionToString(source2)); } { BeanAccessor ba=FastBeanWrapperImpl.getAccessorFor(Foo.class); Foo foo=new Foo(); foo.setId(1); foo.setName("aaa"); foo.setScore(123D); foo.setCreated(new Date()); Map map=ba.convert(foo); ba.getAnnotationOnField("name"); ba.getAnnotationOnGetter("name"); ba.getAnnotationOnSetter("name"); map.remove("score"); Foo foo2=(Foo)ba.fromMap(map); System.out.println(map); System.out.println(ToStringBuilder.reflectionToString(foo)); System.out.println(ToStringBuilder.reflectionToString(foo2)); map.put("id", "3"); Foo foo3=BeanUtils.undescribeSafe(map, Foo.class); System.out.println(ToStringBuilder.reflectionToString(foo3)); } } }