Java를 이용하여 알고리즘 문제(백준, 토마토, 7576)를 풀어 보다가 스캐너(Scanner)를 이용할 때와 버퍼리더(BufferedReader)를 이용할 때의 속도 차이를 비교해 보았습니다.
동일한 로직을 데이터를 입력 받는 부분만 스캐너와 버퍼리더를 이용하여 시간을 비교해본 결과가 다음과 같습니다.
- 스캐너
- 시간: 1620 ms
- 메모리: 335660 KB
- 버퍼리더
- 시간: 552 ms
- 메모리: 143148 KB
스캐너- 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;
따라서 알고리즘 문제를 풀이할 때 속도가 중요하다면 스캐너 보다는 버퍼리더를 이용하는 것이 좋습니다.
'알고리즘' 카테고리의 다른 글
[알고리즘] 코딩, 알고리즘 연습 사이트 (6) | 2019.04.24 |
---|---|
[백준][삼성SW검정] 14889 스타트와 링크 (0) | 2019.01.15 |
[백준][삼성SW검정] 14888 연산자 끼워넣기 (0) | 2019.01.14 |
[정렬][java] 거품정렬(버블소트) (0) | 2018.09.17 |
[알고리즘] 크루스칼 알고리즘 (0) | 2018.04.20 |