首页 > 新闻动态 > 系统应用技巧

B2B2C商城系统之bean复制采用cglib以及其他ben复制性能对比


对象拷贝的应用现状简介

      商城系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最安全的做法,但是当数据对象的属性字段数量超过程序员的容忍的程度,代码因此变得臃肿不堪,使用一些方便的对象拷贝工具类将是很好的选择。

 

目前流行的较为公用认可的工具类:

Apache的两个版本,原理都是反射机制

org.apache.commons.beanutils.PropertyUtils.copyProperties(Object dest, Object orig)

org.apache.commons.beanutils.BeanUtils.copyProperties(Object dest, Object orig)

Spring版本,原理是反射机制

org.springframework.beans.BeanUtils.copyProperties(Object source, Object target, Class editable, String[] ignoreProperties)

cglib版本,原理是使用动态代理,并发量越大,效率高

net.sf.cglib.beans.BeanCopier.copy(Object paramObject1, Object paramObject2, Converter paramConverter)

 

例子:

创建易写科技Bean,另外一个beanTo易写科技Bean,就不列举出来

package com.易写科技.test;

 

public class 易写科技Bean {

    private String name;

    private int    age;

    private String address;

    private String idno;

    private double money;

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public int getAge() {

        return age;

    }

 

    public void setAge(int age) {

        this.age = age;

    }

 

    public String getAddress() {

        return address;

    }

 

    public void setAddress(String address) {

        this.address = address;

    }

 

    public String getIdno() {

        return idno;

    }

 

    public void setIdno(String idno) {

        this.idno = idno;

    }

 

    public double getMoney() {

        return money;

    }

 

    public void setMoney(double money) {

        this.money = money;

    }

 

}

现在分别测试对象复制一次,1000次,10000次,1000000次的销量

一次的代码为:

package com.易写科技.test;

 

public class 易写科技Main {

 

    public static void main(String[] args) throws Exception {

        易写科技Bean frombean = new 易写科技Bean();

        frombean.setAddress("北京市昌平区青年创业大厦6");

        frombean.setAge(30);

        frombean.setMoney(100000.00);

        frombean.setIdno("18612670879");

        frombean.setName("测试javabean");

 

        long l1 = System.currentTimeMillis();

        To易写科技Bean toBean1 = new To易写科技Bean();

        org.apache.commons.beanutils.BeanUtils.copyProperties(toBean1, frombean);

        long l2 = System.currentTimeMillis();

        System.out.println("org.apache.commons.beanutils.BeanUtils,一次时间:" + (l2 - l1));

 

        long l3 = System.currentTimeMillis();

        To易写科技Bean toBean2 = new To易写科技Bean();

        org.apache.commons.beanutils.PropertyUtils.copyProperties(toBean2, frombean);

        long l4 = System.currentTimeMillis();

        System.out.println("org.apache.commons.beanutils.PropertyUtils,一次时间:" + (l4 - l3));

 

        long l5 = System.currentTimeMillis();

        To易写科技Bean toBean3 = new To易写科技Bean();

        org.springframework.beans.BeanUtils.copyProperties(frombean, toBean3);

        long l6 = System.currentTimeMillis();

        System.out.println("org.springframework.beans.BeanUtils,一次时间:" + (l6 - l5));

 

        long l7 = System.currentTimeMillis();

        final net.sf.cglib.beans.BeanCopier bc = net.sf.cglib.beans.BeanCopier.create(

            易写科技Bean.class, To易写科技Bean.class, false);

        To易写科技Bean toBean4 = new To易写科技Bean();

        bc.copy(frombean, toBean4, null);

        long l8 = System.currentTimeMillis();

        System.out.println("net.sf.cglib.beans.BeanCopier,一次时间:" + (l8 - l7));

 

    }

}

运行结果为:

org.apache.commons.beanutils.BeanUtils,一次时间:241

org.apache.commons.beanutils.PropertyUtils,一次时间:7

org.springframework.beans.BeanUtils,一次时间:28

net.sf.cglib.beans.BeanCopier,一次时间:8

100次结果:

org.apache.commons.beanutils.BeanUtils,100次时间:278

org.apache.commons.beanutils.PropertyUtils,100次时间:18

org.springframework.beans.BeanUtils,100次时间:31

net.sf.cglib.beans.BeanCopier,100次时间:30

10000次结果

org.apache.commons.beanutils.BeanUtils,10000次时间:823

org.apache.commons.beanutils.PropertyUtils,10000次时间:155

org.springframework.beans.BeanUtils,10000次时间:80

net.sf.cglib.beans.BeanCopier,10000次时间:67

1000000次结果:

org.apache.commons.beanutils.BeanUtils,1000000次时间:11702

org.apache.commons.beanutils.PropertyUtils,1000000次时间:4318

org.springframework.beans.BeanUtils,1000000次时间:404

net.sf.cglib.beans.BeanCopier,1000000次时间:79

 

由以上测试得出结论,cglib 的效率是 直接反射的3倍以上,另外,cglibbeanMap在初次创建一个类的缓存时会耗费一定的时间,之后使用了缓存,再创建相同的bean就不再有多余的时间消耗了。所以量越大消耗反而越小,其他量越大,消耗的时间也随着增大。

 

所以易写科技是采用cglib来作为对象的复制的。


产品推荐

关于我们  | 联系我们  | 加入我们 版权所有 ©2015-©2023 北京易写科技有限公司.保留一切权利.ICP证:京ICP备16052268号-3