`

spring的BeanUtils和cglib的BeanCopier性能比较

 
阅读更多

 

测试环境:

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); 

 

}

 

分享到:
评论

相关推荐

    Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier

    这篇文章将对比分析Apache BeanUtils、PropertyUtils、Spring BeanUtils以及Cglib BeanCopier这四个常用的Bean复制工具的性能和特点。 首先,Apache BeanUtils是Apache Commons项目的一部分,提供了一系列便捷的...

    JSP 开发之Spring BeanUtils组件使用

    在JSP开发中,Spring框架提供的BeanUtils组件是处理JavaBean的一个重要工具,它可以帮助开发者在不直接编写代码的情况下,完成JavaBean之间的属性复制工作。下面将详细讲解Spring BeanUtils组件的使用方法,并通过...

    Spring-BeanUtils工具类

    总的来说,Spring BeanUtils是Spring框架中的一个强大工具,能够简化JavaBean的处理,提高开发效率,但同时也需要开发者在使用时注意数据安全和类型转换的正确性。了解并熟练掌握BeanUtils的使用,对于日常的Spring...

    这是BeanUtils的jar包

    BeanUtils最核心的好处在于:我们在编码时,并不需要知道我们处理的JavaBeans具体是什么类型,有哪些属性,这些信息是可以动态获取的,甚至我们都可以不必去关心事实上是否存在这样一个具体的JavaBean类。...

    BeanUtils jar包+源码

    BeanUtils的核心功能在于属性的自动类型转换和封装,它能够自动处理JavaBeans对象之间的属性拷贝,即使源对象和目标对象的属性类型不完全匹配,BeanUtils也能尝试进行类型转换。例如,将字符串转换为整型或浮点型,...

    BeanUtils包含源码和jar包, 包含BeanUtils和logging一套拿走,有源码和jar包

    在实际开发中,我们不仅可以通过BeanUtils来简化JavaBean的操作,还可以结合Spring框架中的BeanUtils,实现更高级的特性,比如AOP(面向切面编程)中的自动装配和属性注入。 总的来说,这个压缩包提供的BeanUtils...

    commons-beanutils-1.8.3和commons-beanutils-1.8.0

    在实际项目中,升级到`commons-beanutils-1.8.3`可能会带来更好的性能和稳定性,但也需要注意检查与现有代码的兼容性,确保所有功能仍然可以正常工作。在引入任何新的库或升级库时,进行充分的测试是至关重要的。...

    BeanMapper:比BeanUtils.copyProperties更快

    由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在运行时直接生成字节码来转换类,在首次生成后,后续...

    beanutils 1.8 jar包+源码_阿锦—小白

    通过阅读源码,开发者可以了解到如何处理异常、如何优化性能,以及如何编写更加健壮和灵活的工具类。 在实际项目中,BeanUtils常被用于数据绑定,尤其是在MVC框架中,如Spring MVC。它可以将HTTP请求参数自动映射到...

    beanUtils和logging的合集jar包

    3. **性能优化**:在某些情况下,Commons Logging能够避免不必要的类加载和初始化,从而提高应用性能。 4. **模块化**:日志记录可以根据不同的模块或组件进行配置,使得日志管理和调试更加精确。 这两个库的结合...

    Spring所需jar包

    commons-beanutils.jar commons-collections-3.1.jar commons-lang-2.3.jar commons-logging-1.1.3.jar ezmorph-1.0.6.jar jackson-all-1.7.4.jar ojdbc5.jar org.springframework.aop-3.0.0.RELEASE.jar org.spring...

    commons-beanutils-1.9.2下载

    在实际开发中,Apache Commons BeanUtils常用于Web框架如Struts和Spring,以及任何需要进行JavaBean操作的场景。1.9.2版本的发布可能包含了性能优化、bug修复以及新特性的添加,确保了与现代Java环境的兼容性。 总...

    Java开发手册(嵩山版)灵魂15问.pdf

    相比其他如Spring的BeanUtils、Cglib的BeanCopier等工具,BeanUtils在处理大量对象复制时可能会导致性能瓶颈。这是因为BeanUtils内部实现中涉及了反射和异常处理,这些操作在循环中大量执行时会消耗更多的时间。 ...

    commons-beanutils (1.7.0 -1.9.2)6个

    - **1.8.0**:在此版本中,可能引入了新特性或修复了一些已知问题,增强了库的稳定性和性能。 - **1.8.2**和**1.8.3**:作为连续的小版本更新,这些版本通常包含对之前版本的错误修正和小规模的功能增强。 - **...

    commons-beanutils-1.9.4

    在本文中,我们将深入探讨`commons-beanutils-1.9.4`这个版本,了解其核心功能、使用场景以及如何在项目中集成和应用。 Apache Commons BeanUtils库的主要目标是简化JavaBean对象的属性访问。它通过提供一系列静态...

    commons-beanutils-1.8.2-src官方源文件,是你学习beanutils工具的必备资料

    这个"commons-beanutils-1.8.2-src"官方源文件包,是学习和理解BeanUtils核心功能的宝贵资源。在这个版本中,我们可以深入到源代码层面,探究BeanUtils是如何实现对Java Bean属性的便捷访问、复制和转换的。 1. **...

    commons-beanutils 源码

    - 在实际开发中,了解并掌握BeanUtils的内部工作原理,可以帮助我们更高效地使用这个库,避免不必要的性能损耗,同时也可以从中学习到如何优雅地使用反射和异常处理。 总结来说,Apache Commons BeanUtils是Java...

    spring2.0_jar

    它是所有其他Spring模块的基础,提供了如Resource接口、BeanUtils工具类等核心功能。 8. cglib-nodep-2.1_3.jar:CGLIB是一个代码生成库,常用于动态创建子类以实现对目标类的方法增强。在Spring AOP中,CGLIB被...

Global site tag (gtag.js) - Google Analytics