?
測試環境:
JDK1.6.29
CPU:I7 2.80 雙核四線程
單位為納秒
測試對象?
?
1)spring包中的 BeanUtil ? ? 采用反射實現
2)cglib包中的 ?Beancopier ? 采用動態字節碼實現
?
?
1.對象包含所有的基本類型?
public class TestBeanSource1 {
?
? ? private String ? ? ? ? ? ? ?str;
? ? private byte ? ? ? ? ? ? ? ?b;
? ? private short ? ? ? ? ? ? ? s;
? ? private int ? ? ? ? ? ? ? ? i;
? ? private long ? ? ? ? ? ? ? ?l;
? ? private double ? ? ? ? ? ? ?d;
? ? private float ? ? ? ? ? ? ? f;
? ? private char ? ? ? ? ? ? ? ?c;
? ? private boolean ? ? ? ? ? ? bb;
? ? private List<String> ? ? ? ?ll;
? ? private Map<String, String> map;
?
場景一:copy次數 :1?
spring.beanUtil : costs : 57
cglib ? ? ? ? ? : costs : 0
?
場景二:copy次數 :10000
spring.beanUtil : total1:327?
cglib ? ? ? ? ? : total2:55?
?
場景三:copy次數 :100000
spring.beanUtil : total1:839?
cglib ? ? ? ? ? : total2:392?
?
場景四:copy次數 :1000000
spring.beanUtil : total1:5609?
cglib ? ? ? ? ? : total2:3436?
?
場景五:copy次數 :10000000
spring.beanUtil : total1:53597 avg: 0
cglib ? ? ? ? ? : total2:32668 avg: 0
?
?
從數據上我們可以看出,在小數量級上,cglib的性能優勢明顯,但是隨著數據量增大,兩者的差距基本在2:1。
?
取一個業務線上的實際對象做測試:
?
對象屬性:
public class TestBeanSource2 {
?
? ? private String ?userPW;
? ? private String ?userEmail;
? ? private String ?userNickName;
? ? private Integer userCity;
? ? private Integer userSource;
? ? private Integer userPower;
? ? private String ?userFace;
? ? private Integer userVote;
? ? private Integer userVoteGood;
? ? private Integer userLogin;
? ? private Integer userDailyLogin;
? ? private Integer userHits;
? ? private String ?userIP;
? ? private Boolean isRefusePromo;
? ? private Integer regInviteNo;
? ? private Boolean isRefuseCard;
? ? private Integer emailOption;
? ? private Integer groupTotal;
? ? private Integer userStatus;
? ? private String ?userTags;
? ? private String ?permaLink;
? ? private String ?rawURL;
? ? private Integer freeBookCity;
? ? private Integer manaScore;
? ? private Integer dcash;
? ? private Integer userBigFace;
? ? private Integer groupUserScore;
? ? private Integer oldGroupUserScore;
? ? private Integer manaOfReview;
? ? private Integer manaOfShop;
? ? private Integer manaOfPic;
? ? private Integer manaOfOther;
? ? private String ?mobileNO;
? ? private Integer mobileNOStatus;
? ? private Integer manaOfUserBase;
? ? private Integer userEmailVerifyStatus;
?
?
場景一:copy次數 :1?
spring.beanUtil : costs : 100160495
cglib ? ? ? ? ? : costs : 169295
?
場景二:copy次數 :10000
spring.beanUtil : 447733683 avg: 44
cglib ? ? ? ? ? : 56684493 avg: 5
?
場景三:copy次數 :100000
spring.beanUtil : 1278141962 avg: 127
cglib ? ? ? ? ? : 392142487 avg: 39?
?
場景四:copy次數 :1000000
spring.beanUtil : 9722299911 avg: 972
cglib ? ? ? ? ? : 3292135548 avg: 329?
?
場景五:copy次數 :10000000
spring.beanUtil : total1:91461239886 avg: 9146
cglib ? ? ? ? ? : total2:32762515523 avg: 3276
?
當我們拿實際的業務DO來做測試時候,規律同上,隨著數量級的增大,兩者之間的差距在降低,基本維持在3:1左右。
對比第一個測試,我們可以看出,隨著業務對象的復雜度增高,cglib的性能相對反射之間的差距會越來越大。
故推薦使用cglib的beanCopier
?
?
cglib的簡單使用:?
public class CglibCopier extends BeanCopyTemplate {?
?
private static final BeanCopier beanCopier2 = BeanCopier.create(TestBeanSource1.class,TestBeanTarget1.class, false);?
?
@Override?
public void handle(TestBeanSource2 source, TestBeanTarget2 target) {?
beanCopier2.copy(source, target, null);?
}?
?
}
?
已有 0 人發表留言,猛擊->>這里<<-參與討論
ITeye推薦