ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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.0

     

    println 메서드 내부 호출 과정

    //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.408178E8

     

    JDK 8버전을 사용했을 때는 예상과 동일하게 동작하는것 같습니다.

     

    결론

    BufferedWriter가 println보다 효율적이다.

     

     

     

    댓글

Designed by Tistory.