네 가지 대상 속성의 복사

비교 한 것 은 Apache 의 BeanUtils 와 Property Utils, Spring 의 BeanUtils, Cglib 의 BeanCopier 등 네 가지 복사 방식 이다.방법 은 Eclipse 에 Project 를 새로 만 들 었 는데 몇 가지 코드 의 성능 을 전문 적 으로 테스트 하 는 데 사용 된다.구체 적 인 코드 는 다음 과 같다.
       하나의 FromBean 과 하나의 ToBean, 두 개의 코드 는 기본적으로 같 습 니 다. 클래스 이름 이 다른 것 을 제외 하고 한 부 만 붙 였 습 니 다.
       
public class FromBean {
    private String name;
    private int age;
    private String address;
    private String idno;
    private double money;
 
    public double getMoney() {
        return money;
    }
 
    public void setMoney(double money) {
        this.money = 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;
    }
 
}

 
테스트 에 사용 할 BenchmarkTest 클래스 는 중복 코드 를 줄 이기 위해 정책 모드 를 썼 습 니 다.
     
 
public class BenchmarkTest {
    private int count;

    public BenchmarkTest(int count) {
        this.count = count;
        System.out.println("    " + this.count + "==================");
    }

    public void benchmark(IMethodCallBack m, FromBean frombean) {
        try {
            long begin = new java.util.Date().getTime();
            ToBean tobean = null;
            System.out.println(m.getMethodName() + "      ");
            for (int i = 0; i < count; i++) {

                tobean = m.callMethod(frombean);

            }
            long end = new java.util.Date().getTime();
            System.out.println(m.getMethodName() + "  " + (end - begin));
            System.out.println(tobean.getAddress());
            System.out.println(tobean.getAge());
            System.out.println(tobean.getIdno());
            System.out.println(tobean.getMoney());
            System.out.println(tobean.getName());
            System.out.println("                                      ");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 
 정책 에 사용 할 인터페이스 설명
 
public interface IMethodCallBack {

    String getMethodName();

    ToBean callMethod(FromBean frombean)  throws Exception;

}

 
사용 한 테스트 클래스
public class TestMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        FromBean fb = new FromBean();
        fb.setAddress("         ");
        fb.setAge(20);
        fb.setMoney(30000.111);
        fb.setIdno("110330219879208733");
        fb.setName("  ");

        IMethodCallBack beanutilCB = new IMethodCallBack() {

            @Override
            public String getMethodName() {
                return "BeanUtil.copyProperties";
            }

            @Override
            public ToBean callMethod(FromBean frombean) throws Exception {

                ToBean toBean = new ToBean();
                BeanUtils.copyProperties(toBean, frombean);
                return toBean;
            }
        };

        IMethodCallBack propertyCB = new IMethodCallBack() {

            @Override
            public String getMethodName() {
                return "PropertyUtils.copyProperties";
            }

            @Override
            public ToBean callMethod(FromBean frombean) throws Exception {
                ToBean toBean = new ToBean();
                PropertyUtils.copyProperties(toBean, frombean);
                return toBean;
            }
        };

        IMethodCallBack springCB = new IMethodCallBack() {

            @Override
            public String getMethodName() {
                return "org.springframework.beans.BeanUtils.copyProperties";
            }

            @Override
            public ToBean callMethod(FromBean frombean) throws Exception {
                ToBean toBean = new ToBean();
                org.springframework.beans.BeanUtils.copyProperties(frombean,
                        toBean);
                return toBean;
            }
        };

        IMethodCallBack cglibCB = new IMethodCallBack() {
            BeanCopier bc = BeanCopier.create(FromBean.class, ToBean.class,
                    false);

            @Override
            public String getMethodName() {
                return "BeanCopier.create";
            }

            @Override
            public ToBean callMethod(FromBean frombean) throws Exception {
                ToBean toBean = new ToBean();
                bc.copy(frombean, toBean, null);
                return toBean;
            }
        };

        //        ,    
        BenchmarkTest bt = new BenchmarkTest(10);
        bt.benchmark(beanutilCB, fb);
        bt.benchmark(propertyCB, fb);
        bt.benchmark(springCB, fb);
        bt.benchmark(cglibCB, fb);

        //          
        BenchmarkTest bt10000 = new BenchmarkTest(10000);
        bt10000.benchmark(beanutilCB, fb);
        bt10000.benchmark(propertyCB, fb);
        bt10000.benchmark(springCB, fb);
        bt10000.benchmark(cglibCB, fb);

        //               
        BenchmarkTest bt1000R = new BenchmarkTest(10000);
        bt1000R.benchmark(cglibCB, fb);
        bt1000R.benchmark(springCB, fb);
        bt1000R.benchmark(propertyCB, fb);
        bt1000R.benchmark(beanutilCB, fb);

    }

}

 
 
 세 차례 의 테스트 를 실 시 했 는데 마지막 결 과 는 다음 과 같다.
10 차 시험
처음
두 번 째
세 번 째
평균 값
매번 평균치
BeanUtil.copyProperties
54
57
50
53.66667
5.366666667
PropertyUtils.copyProperties
4
4
4
4
0.4
org.springframework.beans.BeanUtils.copyProperties
12
10
11
11
1.1
BeanCopier.create
0
0
0
0
0
 
10000 회 테스트
처음
두 번 째
세 번 째
평균 값
매번 평균치
BeanUtil.copyProperties
241
222
226
229.6667
0.022966667
PropertyUtils.copyProperties
92
90
92
91.33333
0.009133333
org.springframework.beans.BeanUtils.copyProperties
29
30
32
30.33333
0.003033333
BeanCopier.create
1
1
1
1
0.1
 
10000 회 반전 테스트
처음
두 번 째
세 번 째
평균 값
매번 평균치
BeanUtil.copyProperties
178
174
178
176.6667
0.017666667
PropertyUtils.copyProperties
91
87
89
89
0.0089
org.springframework.beans.BeanUtils.copyProperties
21
21
21
21
0.0021
BeanCopier.create
0
1
1
0.666667
6.66667E-05
 
      그러나 주의해 야 할 것 은 Cglib 가 테스트 할 때 먼저 인 스 턴 스 캐 시 를 한 것 도 그의 성능 이 좋 은 이유 중 하나 이다.캐 시 를 없 애 면 성능 에 약간의 차이 가 생 길 수 있 지만 전체적인 성능 은 좋다. 그런데 이상 하 게 도 10000 번 이 10 번 보다 적 고 뒤의 반전 1 만 번 이 오히려 가장 적 게 걸 리 며 여러 번 의 테스트 효과 도 마찬가지다.    전체적인 표현 을 보면 Cglib 의 BeanCopier 의 성능 은 가장 좋다. 수량 이 많은 1 만 번 의 테스트 든 수량 이 적은 10 번 이 든 거의 모두 가 까 워 지고 제로 손실 이다. Spring 은 횟수 가 증가 한 상황 에서 성능 이 좋 고 데이터 가 적 을 때 Property Utils 보다 성능 이 떨어진다.Property Utils 의 성능 이 상대 적 으로 안정 적 이 고 선형 성장 세 를 보 이 는 것 으로 나 타 났 다.한편, Apache 의 BeanUtil 은 성능 이 가장 나 빠 서 한 번 의 복사 든 여러 번 의 복사 성능 이 좋 지 않다.
 
열 번
10000 회
10000 회 반전
BeanCopier.create
41
28
10
      성능 테스트 는 여기까지 입 니 다. 데이터 도 위 와 같이 보 여 줍 니 다. 다음 에 나머지 두 편의 글 을 계속 작성 할 것 입 니 다. 이 글 은 성능 에 관심 을 가지 고 있 습 니 다. 뒤의 한 편 은 모든 방식 의 사용 상의 차이 에 대해 상세 하 게 설명 하고 마지막 편 은 이 네 가지 방식 의 성능 차 이 를 연구 하고 자 합 니 다.출처:http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.html

좋은 웹페이지 즐겨찾기