プロパティcopyパフォーマンス比較
5136 ワード
2つのbeanの間には共通の属性があり、同じ属性間の付与を実現するにはset,getを使用します.この方法が最も効率的です.beanが大量の属性を含み、値を付与している場合、最も大量のget、set、コードがメンテナンスに不利である場合、PropertyUtils、BeanUtils、PropertyUtilsBeanはcopyPropertiesメソッドを提供しています.もちろん、反射によって自分で実現することもできます.各性能は以下の通りです.
使用時の出力は次のとおりです.
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メソッド.
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メソッド.