プロパティcopyパフォーマンス比較

5136 ワード

2つのbeanの間には共通の属性があり、同じ属性間の付与を実現するにはset,getを使用します.この方法が最も効率的です.beanが大量の属性を含み、値を付与している場合、最も大量のget、set、コードがメンテナンスに不利である場合、PropertyUtils、BeanUtils、PropertyUtilsBeanはcopyPropertiesメソッドを提供しています.もちろん、反射によって自分で実現することもできます.各性能は以下の通りです.
Student s1 = new Student();
		s1.setName("zhangsan");
		s1.setAge(26);
		s1.setBirthDay(new Date());
		Student s2 = new Student();
		long start = System.nanoTime();
		s2.setAge(s1.getAge());
		s2.setName(s1.getName());
		long end = System.nanoTime(); 
		System.out.println("set :" + (end - start));
		Student s3 = new Student();
		start = System.nanoTime();
		try{
			PropertyUtils.copyProperties(s3, s1);
		} catch (Exception e){
		}
		end = System.nanoTime();
		System.out.println("name=" + s3.getName() + ",age=" + s3.getAge() + ",date=" + s3.getBirthDay());
		System.out.println("propertyCopy :" + (end - start));  
		Student s4 = new Student();
		start = System.nanoTime();
		try{
			BeanUtils.copyProperties(s4, s1);     
		} catch (Exception e){
		}
		end = System.nanoTime();
		System.out.println("name=" + s4.getName() + ",age=" + s4.getAge() + ",date=" + s4.getBirthDay());    
		System.out.println("beanUtils :" + (end - start));   
		
		Student s5 = new Student();
		start = System.nanoTime();
		try{
			PropertyUtilsBean.class.newInstance().copyProperties(s5, s1);
		} catch (Exception e){
		}
		end = System.nanoTime();
		System.out.println("name=" + s5.getName() + ",age=" + s5.getAge() + ",date=" + s5.getBirthDay());       
		System.out.println("PropertyUtilsBean :" + (end - start));
		
		Student s6 = new Student();
		start = System.nanoTime();
		try{
			copyProperties(s6, s1);
		} catch (Exception e){
		}
		end = System.nanoTime();
		System.out.println("name=" + s6.getName() + ",age=" + s6.getAge() + ",date=" + s6.getBirthDay());       
		System.out.println(" :" + (end - start));   
独自のcopyコード
public static Object copyProperties(Object dbInstance, Object bean) {
        Class klass = bean.getClass();
        Object obj = null;
        Method methods[] = klass.getMethods();
        for (int i = 0; i < methods.length; i++) {
            Method method = methods[i];
            String name = method.getName();
            String key = "";
            if (name.startsWith("get") && !name.equals("getClass")) {
                key = name.substring(3);
            } else {
                if (!name.startsWith("is")) {
                    continue;
                }
                key = name.substring(2);
            }
            try {
                obj = method.invoke(bean, new Object[]{});
            } catch (Exception e) {
            	e.printStackTrace();
            }
            if (obj != null
                    && !obj.getClass().getName().equals("java.util.HashSet")) {
                try {
                    for (int j = 0; j < methods.length; j++) {
                        if (!methods[j].getName().equals(
                                (new StringBuilder("set")).append(key)
                                        .toString())) {
                            continue;
                        }
                        Object objs[] = new Object[1];
                        objs[0] = obj;
                        methods[j].invoke(dbInstance, objs);
                        break;
                    }
                } catch (Exception e) {
                    key = name.substring(3);
                    for (int j = 0; j < methods.length; j++) {
                        if (!methods[j].getName().equals(
                                (new StringBuilder("set")).append(key)
                                        .toString())) {
                            continue;
                        }
                        Object objs[] = new Object[1];
                        objs[0] = obj;
                        try {
                            methods[j].invoke(dbInstance, objs);
                        } catch (Exception ex) {
                        	ex.printStackTrace();
                        }
                        break;
                    }
                }
            }
        }
        return dbInstance; 
    }

使用時の出力は次のとおりです.
set方法用時:3642ナノ秒INFO 2013-11-28 21:43:26015[main][c n.com.carsmart.util.configmanagement.config reader type is set to default classpath loading way.
log4j:WARN unable to find the env.properties file
name=zhangsan,age=26,date=Thu Nov 28 21:43:25 CST 2013
propertyCopyメソッド使用時間:238577700ナノ秒
name=zhangsan,age=26,date=Thu Nov 28 21:43:25 CST 2013
beanUtilsメソッド使用時間:792249ナノ秒
name=zhangsan,age=26,date=Thu Nov 28 21:43:25 CST 2013
PropertyUtilsBeanメソッド使用時間:128124ナノ秒
name=zhangsan,age=26,date=Thu Nov 28 21:43:25 CST 2013
自己実現方法用時間:60255ナノ秒
結論:性能に対する要求が特に高いset,get方法;単純な属性の自己反射のみが実現されます.性能に対する要求があまり高くなく、コードがメンテナンスしやすいPropertyUtilsBeanのcopyPropertiesメソッド.