본문 바로가기
알고리즘

[알고리즘] Scanner와 BufferedReader의 속도 차이

by hs_seo 2019. 3. 21.

Java를 이용하여 알고리즘 문제(백준, 토마토, 7576)를 풀어 보다가 스캐너(Scanner)를 이용할 때와 버퍼리더(BufferedReader)를 이용할 때의 속도 차이를 비교해 보았습니다.


동일한 로직을 데이터를 입력 받는 부분만 스캐너와 버퍼리더를 이용하여 시간을 비교해본 결과가 다음과 같습니다.


  • 스캐너
    • 시간: 1620 ms
    • 메모리: 335660 KB
  • 버퍼리더
    • 시간: 552 ms
    • 메모리: 143148 KB

스캐너를 이용하는 경우 시간은 3배, 메모리는 2배 정도 더 사용하는 것을 볼 수 있습니다.


스캐너- JDK7 소스 [바로가기]

버퍼리더- JDK7 소스 [바로가기]


소스를 확인해 보면 스캐너의 캐쉬는 1024, 버퍼리더는 8192이고,

스캐너는 데이터를 입력받을 때 정규식을 이용하여 입력 값을 검사하기 때문에 속도가 매우 느립니다.


아래는 스캐너의 nextInt() 코드 입니다.

integerPattern을 이용하여 데이터의 패턴을 검사하는 것을 확인할 수 있습니다.


public int nextInt(int radix) {
    // Check cached result
    if ((typeCache != null) && (typeCache instanceof Integer)
        && this.radix == radix) {
        int val = ((Integer)typeCache).intValue();
        useTypeCache();
        return val;
    }
    setRadix(radix);
    clearCaches();
    // Search for next int
    try {
        String s = next(integerPattern());
        if (matcher.group(SIMPLE_GROUP_INDEX) == null)
            s = processIntegerToken(s);
        return Integer.parseInt(s, radix);
    } catch (NumberFormatException nfe) {
        position = matcher.start(); // don't skip bad token
        throw new InputMismatchException(nfe.getMessage());
    }
}


private Pattern integerPattern;
private String digits = "0123456789abcdefghijklmnopqrstuvwxyz";
private String non0Digit = "[\\p{javaDigit}&&[^0]]";
private int SIMPLE_GROUP_INDEX = 5;


따라서 알고리즘 문제를 풀이할 때 속도가 중요하다면 스캐너 보다는 버퍼리더를 이용하는 것이 좋습니다.

반응형