-
[Java] BufferedWriter vs println 속도분석Java 2022. 3. 4. 00:01반응형
알고리즘 문제를 풀다가 println으로 제출시에는 시간초과가 발생하고 BufferedWriter는 성공을 하는 문제가 있었습니다.
출력하는 구문이 숫자 1개 였기 때문에 버퍼를 사용하나 하지 않으나 동일할것으로 예상했었습니다.
하지만 숫자 1개를 출력할 때 속도 차이를 테스트했을시에 BufferedWriter가 10배이상 빠른 성능을 보였습니다.테스트 코드
int iterate = 1; double startPrint = System.nanoTime(); for(int i=0; i<iterate; i++) { System.out.println(1); } double finishPrint = System.nanoTime(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); double startBw = System.nanoTime(); for(int i=0; i<iterate; i++) { bw.write(1 + "\n"); bw.flush(); } double finishBw = System.nanoTime(); System.out.println(finishPrint - startPrint); System.out.println(finishBw - startBw);
결과
println 수행시간 : 163400.0
BufferedWriter 수행시간 : 17000.0println 메서드 내부 호출 과정
//println(int x) 메서드 public void println(int x) { if (getClass() == PrintStream.class) { writeln(String.valueOf(x)); } else { synchronized (this) { print(x); newLine(); } } } //writeln(String s) 메서드 private void writeln(String s) { try { synchronized (this) { ensureOpen(); textOut.write(s); textOut.newLine(); textOut.flushBuffer(); charOut.flushBuffer(); if (autoFlush) out.flush(); } } catch (InterruptedIOException x) { Thread.currentThread().interrupt(); } catch (IOException x) { trouble = true; } } //testOut과 charOut 변수 private BufferedWriter textOut; private OutputStreamWriter charOut;
내부 메서드 호출과정이 궁금하여 메서드를 타고 들어가 보았을 때 "println 에서도 내부적으로 BufferedWriter textOut을 사용하기 때문에 자연스럽게 BufferedWriter가 더 빠르겠구나" 라고 생각하였습니다.
하지만 iterate를 증가할수록 속도차이가 좁혀졌으며 100,000번 반복하였을때는 BufferedWriter가 더 느렸습니다.
iterate = 100000 반복시
println 수행시간 : 2.794099E8
BufferedWriter 수행시간 : 3.4951332E9뭔가 이상해서 JDK 8버전으로도 수행해보았습니다. ( 위에서는 JDK 16버전을 사용했습니다.)
println 수행시간 : 2.870767E8
BufferedWriter 수행시간 : 1.408178E8JDK 8버전을 사용했을 때는 예상과 동일하게 동작하는것 같습니다.
결론
BufferedWriter가 println보다 효율적이다.
'Java' 카테고리의 다른 글
[Java] try-catch와 try-with-recources (0) 2022.03.13 [Java] Collections.sort () VS Arrays.sort() (0) 2022.03.10 [Java] Java8 default 인터페이스 (0) 2022.02.28 [Java] 자바의 인자 전달 방식 (call by value와 call by reference) (0) 2022.02.27 [Java] 이클립스 글자 안 보일 때 해결 방법(이클립스 흰 화면 출력 시 해결 방법) (0) 2022.02.26