BeanUtils、PropertyUtils、Dozer
テスト例:
1000回の実行結果:
100000回の実行結果:
1000000回の実行結果:
テスト結果:
1、万回以内の効率beanutilsはdozerより速い
2、10万回以上の効率beanutilsの効率とdozerの差は多くない.
3、以上は基本タイプのみを考慮して比較したもので、dozerがコピーを深くコピーしたり、関連付けたりすると、効率が遅くなるはずです.
4、PropertyUtilsとBeanUtilsの機能は基本的に一致している.唯一の違いは、BeanUtilsはBeanに値を割り当てるとタイプ変換を行うが、PropertyUtilsはタイプ変換を行わず、タイプが異なると異常を投げ出すことである.これは、PropertyUtilsの効率が他の2つよりも高い理由を説明することができます.
推奨:基本タイプはソースターゲットタイプが一致する場合に使用します:PropertyUtilsの方が効率的です.複雑なタイプのコピーは、Dozerを使用できます.
package com.cn.copy.service;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import com.cn.copy.vo.Middle;
import com.cn.copy.vo.MiddleDto;
public class Test {
public static void testMapObjectToObject(int count) {
Middle m1 = new Middle();
m1.setFlag(true);
m1.setId(1000L);
m1.setItem(new int[] { 10, 20, 30 });
m1.setPrice(12.33);
m1.setType("hahaha!");
m1.setDate(new Date());
long t1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
MiddleDto mg = new MiddleDto();
VoPoConverter.copyProperties(mg, m1);
}
System.out.println("DozerBeanMapper-time1:"
+ (System.currentTimeMillis() - t1));
}
public static void testPropertyCopyObjectObject(int count) {
Middle m1 = new Middle();
m1.setFlag(true);
m1.setId(1000L);
m1.setItem(new int[] { 10, 20, 30 });
m1.setPrice(12.33);
m1.setType("hahaha!");
m1.setDate(new Date());
long t1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
MiddleDto mg = new MiddleDto();
try {
PropertyUtils.copyProperties(mg, m1);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("PropertyUtils-time2:"
+ (System.currentTimeMillis() - t1));
}
public static void testBeanCopyObjectObject(int count) {
Middle m1 = new Middle();
m1.setFlag(true);
m1.setId(1000L);
m1.setItem(new int[] { 10, 20, 30 });
m1.setPrice(12.33);
m1.setType("hahaha!");
m1.setDate(new Date());
long t1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
MiddleDto mg = new MiddleDto();
try {
BeanUtils.copyProperties(mg, m1);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("BeanUtils-time3:"
+ (System.currentTimeMillis() - t1));
}
public static void main(String[] args) {
int total = 10000;
Test.testMapObjectToObject(total);
Test.testPropertyCopyObjectObject(total);
Test.testBeanCopyObjectObject(total);
}
}
1000回の実行結果:
DozerBeanMapper-time1:306
PropertyUtils-time2:30
BeanUtils-time3:42
100000回の実行結果:
DozerBeanMapper-time1:2904
PropertyUtils-time2:1155
BeanUtils-time3:2663
1000000回の実行結果:
DozerBeanMapper-time1:26588
PropertyUtils-time2:11454
BeanUtils-time3:26315
テスト結果:
1、万回以内の効率beanutilsはdozerより速い
2、10万回以上の効率beanutilsの効率とdozerの差は多くない.
3、以上は基本タイプのみを考慮して比較したもので、dozerがコピーを深くコピーしたり、関連付けたりすると、効率が遅くなるはずです.
4、PropertyUtilsとBeanUtilsの機能は基本的に一致している.唯一の違いは、BeanUtilsはBeanに値を割り当てるとタイプ変換を行うが、PropertyUtilsはタイプ変換を行わず、タイプが異なると異常を投げ出すことである.これは、PropertyUtilsの効率が他の2つよりも高い理由を説明することができます.
推奨:基本タイプはソースターゲットタイプが一致する場合に使用します:PropertyUtilsの方が効率的です.複雑なタイプのコピーは、Dozerを使用できます.