▶ 자바는 정말 C와는 속도차이에서 비교도 안되는 것일까?
일반적인 생각으로 이 BMT의 게임은 끝난것이나 마찬가지라고 생각하는 분들도 있을것이다.
기본적인 Bench Mark Test를 통해서 다시 한번 어느 정도의 차이가 있는 지 살펴보도록 하겠다.
이번 BMT에서 사용하려 했던 것은 이미 놀새의 전공이 자바이므로 "자바는 결코 C에 뒤지지 않는다"라는 것을 배치테스트를 통해서 한번 시도해보았다는 것만 알아두길 바라며 이의달지 않았으면 한다.
시나리오부터 살펴보도록 하자. 그림을 그리기까지는 그렇고 간단하게 글로서 쓰도록 한다.
1. 어떤 고객사에서 월별로 계산되는 고객정액요금제에 대한 계산을 전체 배치모듈(16개)중의하나로 처리한다.
2. 고객이 서비스받고 있는 상품은 약 20만건이다.
3. Pro*c 모듈과 Java모듈을 이용하여 테스트하도록 한다.
4. Insert Transation 또한 약 20만건정도이다.
환경
==============================================================
Test Server : Sun Enterprise E5500 CPU-8 Memory - 2GB
Database Server : Oracle 9.2.0.1
C-Compiler : Sun WorkShop 6 update 2 C 5.3 2001/05/15
Java : J2SDK1.3.1_02
빌드도구로 C는 Makefile을 사용하였고, 자바는 Ant1.5.2를 사용했다.
또한 검색 및 로직처리에 대한 퍼포먼스를 올리기 위하여 C 와 Java모듈 모두 Btree를 이용하여 인덱싱 및 검색처리를 할 수 있도록 코딩하였고, 자바측에 대한 코드작성 후 tuning을 통하여 속도를 최대한 올리도록 했다.
방식은 서버의 한계치 메모리까지 객체를 저장할 수 있도록 먼저 테스트를 하여 select된 배치성 데이터에 대하여 20만건 데이터를 메모리 로드하여 작성하였고, C의 모듈 경우 또한 자바와 같은 로직을 이용하여 처리하였다.
순서는 먼저 계산되어질 데이터들에 대한 3개테이블 데이터(약20만건)를 각각의 BTree를 생성하여 인덱싱시켜놓은 후, 각 고객이 가진 상품에 대한 내역을 BTree검색을 통하여 개인별로 처리하도록 하였다.
처리된 데이터는 다시 메모리(자바) 또는 SAM(Pro*c)에 저장되어 지며, 모든 고객데이터처리가 완료되는 시점에 target table insert transaction이 시작된다.
C와 Java의 테스트에서 select후 loading된 데이터를 처리하는 시간은 c와 java모두 비슷하였지만 차이는 transaction부터 나기 시작하였다.
다들 아시겠지만, Pro*c의 경우 DB Segment와 직접 연결되어져 array형태로 들어갈 수 있는 환경이 제공이 되므로 10000건의 데이터씩 잘라서 SQL Excute시키는 것이었고, JDBC에서는 먼저 데이터를 PreparedStatement, CallableStatement를 이용하여 데이터 입력을 시도하였다.
자...첫번째 테스트의 결과를 적어보도록 하겠다.
C의 경우
select & logic processing time : 1분 19초
insert the table transaction time : 1분 10초(189203건 insert)
total : 2분 29초
Java의 경우
select & logic processing time : 1분 14초
insert the table transaction time : 4분 22초(189203건 insert)
total : 5분 36초
위에서 보게되면 select와 로직처리시간이 비슷한것으로 보이지만 insert transation에 대하여 점점 차이가 나고 있다. 데이터가 많아지면 많아질수록 그 차이는 점점 더 벌어지는 것은 자명하다.
C의 경우 데이터베이스에 10000건을 입력하는 시간은 최소2초에서 최대4초가 소요되는데 반해 자바의 경우 최소 8초에서 최대 12초의 시간을 보였다.
▶ 게임은 이대로 끝이 난것일까? 자바의 완패로 이 BMT를 결론지을것인가?
여러분들은 어떻게 생각하는가? 배치관련작업에서 자바는 퍼포먼스를 올릴수 없는것인가?
자. 그런 생각을 불식시키기 위하여 JDBC2.0부터 추가된 Statement, PreparedStatement의 batch메소드를 이용하여 배치를 돌려보도록 하였다.
Statement와 PreparedStatement를 보게 되면 batch처리를 위한 모듈이 추가되어져 있음을 알 수 있다. 즉 Pro*C에서 제공하는 parameters 세팅이 array processing같은 형태로 미리 준비가 가능하다는 것이다.
코드를 아래처럼 바꾸도록 처리하였다.
while(xxx) {
count++;
pstmt.setInt(1, XXX);
pstmt.setString(2, xxx);
pstmt.setLong(3, XXX);
pstmt.addBatch();
if( count % 10000 == 0 ) pstmt.executeBatch();
}
자, 위의 코드가 뭐하는 것인가? pstmt에 적용시켜놓은 parameter들을 직접 DB의 transaction으로 발생시키지 않고, 내부segment와 연결되어질 수 있는 string array로 형태로 놓는 것이다.
위와 같이 자바코드를 바꾼 상황하에서 DB를 초기상태로 만든 후 다시 수행해보았다.
결과는 어찌될 것인가?
프로그램 시작 시간 :
13시 19분 59초
프로그램 종료 시간 :
13시 22분 10초
총작업시간 : 2분 11초
작업처리 시간의 리스트를 보도록 하자.
[2003년 03월 XX일 13시 21분 30초] Memory loading succeed
[2003년 03월 XX일 13시 21분 31초] 10000 row inserted..
[2003년 03월 XX일 13시 21분 35초] 20000 row inserted..
[2003년 03월 XX일 13시 21분 36초] 30000 row inserted..
[2003년 03월 XX일 13시 21분 38초] 40000 row inserted..
[2003년 03월 XX일 13시 21분 41초] 50000 row inserted..
[2003년 03월 XX일 13시 21분 43초] 60000 row inserted..
[2003년 03월 XX일 13시 21분 45초] 70000 row inserted..
[2003년 03월 XX일 13시 21분 47초] 80000 row inserted..
[2003년 03월 XX일 13시 21분 50초] 90000 row inserted..
[2003년 03월 XX일 13시 21분 52초] 100000 row inserted..
[2003년 03월 XX일 13시 21분 53초] 110000 row inserted..
[2003년 03월 XX일 13시 21분 56초] 120000 row inserted..
[2003년 03월 XX일 13시 21분 59초] 130000 row inserted..
[2003년 03월 XX일 13시 22분 00초] 140000 row inserted..
[2003년 03월 XX일 13시 22분 02초] 150000 row inserted..
[2003년 03월 XX일 13시 22분 04초] 160000 row inserted..
[2003년 03월 XX일 13시 22분 07초] 170000 row inserted..
[2003년 03월 XX일 13시 22분 09초] 180000 row inserted..
위에 내용에서 10000건당 데이터처리속도는 어떠한가? 최소 1초에서 최대 4초정도이며
평균소요시간이 약 2초정도로 나타나고 있다.
Batch 메소드를 쓰지 않았을 때와 대비한다면 무려 67%의 성능향상을 이루어내었다.Pro*C와 비교해서도 무려 18초라는 시간을 앞당겼다.
빠른 성능을 요구하는 Batch작업에서는 C아니면 안된다는 사람들의 인식을 불식시키기 위하여 놀새~ 머리 터지는 줄 알았다.
추후에 기회가 된다면 JDBC batch작업에 대하여 한번 논해보도록 하겠다.
Written by Carouser : 2002-03-04 http://gwynne.cs.ualberta.ca/~oracle/817doc/java.817/a83724/oraperf1.htm
http://www.javaperformancetuning.com/tips/jdbc_batching.shtml
http://www.onjava.com/pub/a/onjava/2001/12/19/oraclejdbc.html