Scanner 가 느린 가장 큰 이유는 regular expression 의 남용입니다.
예를 들어서 Scanner.nextInt() 는 내부적으로 아래와 같은 regex를 만족하는 입력을 찾으려 합니다.
Scanner 가 이런 짓(?)을 벌이는 이유는 입력에 i18n/l10n 개념을 적용하려고 하기 때문입니다.
예를 들어 Scanner.nextInt() 는 "1,234,567" 과 같은 입력 또한 정수 1234567 로 인정합니다.
안타깝게도 이런 기능은 (거의) 모든 알고리즘 문제에서는 별 쓸모가 없고, 속도저하의 원인으로만 작용하게 되었습니다.
nahwasa 4년 전
https://www.quora.com/Why-is-Scanner-so-much-slower-than-BufferedReader
찾아봐도 제가 이해를 잘 못한것인지 잘 모르겠네요.
버퍼 크기야 데이터 크기가 작다면 상관없을것같고..
Scanner는 토큰을 파싱하고 BufferedReader는 그렇지 않아서 속도차이가 난다고 하는 것 같은데
결국 Scanner의 경우엔 nextInt(), nextDouble() 이런 함수에서 타입을 정해 받을 수 있고 BufferedReader는
String으로만 받을 수 있기 때문이란 말이 아닌가요?
하지만 실제론 Scanner로 nextInt() 하는것보다도 Integer.parseInt()에 BufferedReader로 nextLine() 받은걸 넣는게 더 빠르니
잘 이해가 가지 않네요 ㅠ
혹시 아시는 분 계신가요?