알고리즘

[알고리즘] 입출력 성능 속도

ttony-kim 2023. 4. 4. 14:12

✔ 입력

Scanner < BufferedReader

BufferedReader 클래스는 버퍼를 사용하기 때문에 Scanner 클래스 보다 속도가 월등히 빠르다.
Scanner 클래스는 버퍼를 사용하지 않고, 읽는 과정에서 정규 표현식 적용, 입력값 분할, 파싱여러 처리과정을 거친다.

  • 하나의 입력만 받을 경우 Scanner를 사용하자!
    ➝ Scanner에서 제공하는 nextInt 메서드로 따로 형변환을 하지 않고 받은 입력 그대로를 사용할 수 있다.

  • 입력이 여러줄 이거나 한줄에 여러 입력을 받을 경우 BufferedReader를 사용하자!

 

✔ 분리

StringTokenizer < String.split() / String.charAt()

StringTokenizer의 구분자가 특수한 경우 검사를 해야하는 양이 늘어나서 split보다 속도가 느릴 가능성이 높다. (공식문서도 split을 권장)

StringTokenizer 클래스는 객체를 생성해서 쓰기 때문에 아래와 같이 자리수가 정해져 있는 경우는 charAt쓰는게 낫다.

while((line = br.readLine()) != null) {
    StringTokenizer st = new StringTokenizer(line, " ");
    // 객체를 생성하기 보단 아래와 같은 charAt을 이용
    int a = line.charAt(0)-48;
    int b = line.charAt(2)-48;
}

 

✔ 출력

String + String < StringBuilder

String'+' 연산자를 쓸 경우 새로운 문자열 객체가 생성된다.

// 출력 시 String과 String을 '+' 연산자로 합치는 경우
System.out.println(String + String);

// 반복문을 돌면서 출력 하는 경우
while(true) {
    System.out.println(String);
}

StringBuilder 클래스의 경우는 크기가 변경되면서 문자열을 변경한다.

StringBuilder sb = new StringBuilder;
while(true) {
    sb.append(String);
}
System.out.println(sb);    
  • 위와 같은 이유로 StringBuilder 클래스가 String을 '+' 연산자로 합쳐서 사용하는 것과 계속적으로 출력문을 호출하는 것보다 속도가 빠르다.

 

Reference

https://dlee0129.tistory.com/238
https://href-born-to-code.tistory.com/185
https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java