2011년 6월 9일 목요일

Java performance tips-2

2. String 관련 Tips

① 문자열 연결방법
+연산자를 이용하여 문자열을 연결하게 되면 심하게 performance가 저하됩니다.
StringBuffer클래스를 사용하면 performance가 향상됩니다.

예) + 연산자에 의한 문자열연결 코드예
String result = "";
for (int i=0; i {
result + =i;
}

예) StringBuffer클래스에 의한 문자열연결 코드예
StringBuffer buf = new StringBuffer();
for(int i=0; i
buf.append(i);
}
String result = buf.toString();
더욱이, 연결후의 문자열의 길이를 알고 있을 경우, StringBuffer클래스 생성시에
적당한 초기값을 주면 더욱더 performance가 향상됩니다.
StringBuffer클래스는 용량이 부족하게 되면 내부적으로 버퍼사이즈가 자동으로 변경되나 연결후의 사이즈를 알고 있는 경우에는 초기값으로 사이즈를 주면 그러한 처리과정을 생략할 수 있습니다.

예) StringBuffer buf = new StringBuffer(length);
표) 문자열연결에 관한 performance 측정
연결수: 1000연결수 : 500
+연산자250(ms)7500(ms)
StringBuffer15(ms)20(ms)
StringBuffer(초기값有)2(ms)10(ms)

CPU : Pentium 300MHz/ Memory :128M / OS : Linux/ J2SE:1.3.1

② StringTokenizer클래스
문자열을 자를 때,StringTokenizer클래스를 이용하는 것이 편하기는 하지만 문자열이 고정되어 있는 경우에는 독자적인 Tokenizer를 사용하는것이 효율적입니다. StringTokenizer클래스가 token을 반복할때, 매번 자를문자가 변경되어 있는지를 체크하기 때문입니다.

예) StringTokenizer클래스를 취하는 코드예
String word = "aaa,bbb,ccc,ddd,eee,fff";
StringTokenizer token = new StringTokenizer(word,",");
List list = new ArrayList();
while(token.hasMoreTokens()) {
list.add(token.nextToken());
}

예) 자를문자를 ,로 고정한후 token을 추출한 코드예
String word = "aaa,bbb,ccc,ddd,eee,fff";
List list = new ArrayList();
int now=0;
int next=0;
while ( (next = word.indexOf(",",now)) > 0 )
{
list.add(word.substring(now,next));
now = next + 1;
}

또한 StringTokenizer클래스에는 hasMoreElements()와 hasMoreTokens() 두개의 메소드가 있는데, hasMoreElements()가 내부적으로 hasMoreTokens()를 호출하므로 통상적으로 hasMoreTokens()를 이용 하도록 합니다.

참고) J2SE 1.4부터 새로운 메소드가 추가된것이 있는데, SringTokenizer 클래스의 token 추출과 같은 기능의 메소드로 java.lang.String 클래스의 split()메소드를 소개합니다.
String word = "aaa,bbb,ccc,ddd,eee,fff";
String [] result = word.split(",");

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...