?

測試環(huán)境:

JDK1.6.29

CPU:I7 2.80 雙核四線程

單位為納秒

測試對象?

?

1)spring包中的 BeanUtil ? ? 采用反射實現(xiàn)

2)cglib包中的 ?Beancopier ? 采用動態(tài)字節(jié)碼實現(xiàn)

?

?

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次數(shù) :1?

spring.beanUtil : costs : 57

cglib ? ? ? ? ? : costs : 0

?

場景二:copy次數(shù) :10000

spring.beanUtil : total1:327?

cglib ? ? ? ? ? : total2:55?

?

場景三:copy次數(shù) :100000

spring.beanUtil : total1:839?

cglib ? ? ? ? ? : total2:392?

?

場景四:copy次數(shù) :1000000

spring.beanUtil : total1:5609?

cglib ? ? ? ? ? : total2:3436?

?

場景五:copy次數(shù) :10000000

spring.beanUtil : total1:53597 avg: 0

cglib ? ? ? ? ? : total2:32668 avg: 0

?

?

從數(shù)據(jù)上我們可以看出,在小數(shù)量級上,cglib的性能優(yōu)勢明顯,但是隨著數(shù)據(jù)量增大,兩者的差距基本在2:1。

?

取一個業(yè)務(wù)線上的實際對象做測試:

?

對象屬性:

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次數(shù) :1?

spring.beanUtil : costs : 100160495

cglib ? ? ? ? ? : costs : 169295

?

場景二:copy次數(shù) :10000

spring.beanUtil : 447733683 avg: 44

cglib ? ? ? ? ? : 56684493 avg: 5

?

場景三:copy次數(shù) :100000

spring.beanUtil : 1278141962 avg: 127

cglib ? ? ? ? ? : 392142487 avg: 39?

?

場景四:copy次數(shù) :1000000

spring.beanUtil : 9722299911 avg: 972

cglib ? ? ? ? ? : 3292135548 avg: 329?

?

場景五:copy次數(shù) :10000000

spring.beanUtil : total1:91461239886 avg: 9146

cglib ? ? ? ? ? : total2:32762515523 avg: 3276

?

當(dāng)我們拿實際的業(yè)務(wù)DO來做測試時候,規(guī)律同上,隨著數(shù)量級的增大,兩者之間的差距在降低,基本維持在3:1左右。

對比第一個測試,我們可以看出,隨著業(yè)務(wù)對象的復(fù)雜度增高,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 人發(fā)表留言,猛擊->>這里<<-參與討論


ITeye推薦