[Java] String split 성능테스트.
ITWeb/개발일반 2014. 2. 13. 16:30아래 코드에 오류가 있습니다.
뭐 수정은 안할 예정이구요. ㅋㅋ 알아서 하세요.
딱 보면 논리적으로 틀린 부분이 보입니다.
힌트, 첨 부터 구분할 대상이 없다면.........ㅋ
=============================================================================
뭐 성능 테스트라고 하기까지는 그렇고 String.split 이 성능이 나쁘다는 사실은 잘 알고 있을 거라고 생각 합니다.
그래서 가능 하면 이넘을 안쓰려고 하는데요.
기본적으로 비교 되는 것들이 scanner vs split vs tokenizer 인데요.
이건 이미 비교 자료가 많으니 일단 pass ~
오늘 제가 그냥 테스트한건 split vs indexOf 형변환 vs indexOf 입니다.
편의상 이름을 아래 처럼 하겠습니다.
String.split vs split vs tokenizer
[테스트 코드]
@Test
public void testSplit() {
String original = "field1,field2,field3,field4,field5,field6,field7,field8,field9,field10";
String[] tokens;
List tokenList;
long startTime = 0;
int elapsedTime = 0;
long loop = 10000000;
startTime = System.currentTimeMillis();
for ( int i=0; i<loop; i++ ) {
tokens = original.split(",");
}
elapsedTime = (int)(System.currentTimeMillis() - startTime);
log.debug("String.split EXECUTE:"+elapsedTime);
startTime = System.currentTimeMillis();
for ( int i=0; i<loop; i++ ) {
tokens = split(original, ",");
}
elapsedTime = (int)(System.currentTimeMillis() - startTime);
log.debug("split EXECUTE:"+elapsedTime);
startTime = System.currentTimeMillis();
for ( int i=0; i<loop; i++ ) {
tokenList = tokenizer(original, ",");
}
elapsedTime = (int)(System.currentTimeMillis() - startTime);
log.debug("tokenizer EXECUTE:"+elapsedTime);
}
[결과]
DEBUG: String.split EXECUTE:7935
DEBUG: split EXECUTE:3253
DEBUG: tokenizer EXECUTE:2896
아래는 테스트로 작성한 split, tokenizer 함수 입니다.
이 함수에 대한 최적화는 pass (그냥 기능만 되는 걸로.. )
public String[] split(String original, String delimeter) {
ArrayList<String> tokens = new ArrayList<String>();
tokens = (ArrayList<String>)tokenizer(original, delimeter);
String[] rets = new String[tokens.size()];
rets = tokens.toArray(rets);
return rets;
}
public List tokenizer(String original, String delimeter) {
ArrayList<String> tokens = new ArrayList<String>();
String token = "";
int beginIdx = 0;
int endIdx = original.indexOf(delimeter);
while ( endIdx > -1 ) {
token = original.substring(beginIdx, endIdx);
tokens.add(token);
beginIdx = endIdx + 1;
original = original.substring(beginIdx);
beginIdx = 0;
endIdx = original.indexOf(delimeter);
if ( endIdx == -1 ) {
if ( !original.isEmpty() ) {
tokens.add(original);
}
}
}
return tokens;
}