[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;
    }


: