네 가지 대상 속성의 복사
하나의 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.