[Java]PrintWriter method 성능 비교 (추가 BufferedWriter)

이상헌·2020년 8월 29일
0

java

목록 보기
2/3

PrintWriter의 쓰기 메소드가 너무 많다. 경우에 따라 적절히 써야겠지만 일일히 일단 한 번 다 돌려보고 메모해 놓는다.

실험 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
 
public class printWriterTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PrintWriter pw = null;
            try {
                BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("text.txt", true));
                pw = new PrintWriter(bufferedWriter, true);
                
                //printWriter.println
                long time1 = System.currentTimeMillis ();
                for(int i=0;i<1000000;i++)
                	pw.println("우리 집에 왜 왔니?println\n");
                long time2 = System.currentTimeMillis ();
                
              //printWriter.printf
                long time3 = System.currentTimeMillis ();
                for(int i=0;i&lt;1000000;i++)
                	pw.printf("%s", "우리 집에 왜 왔니?printf\n");
                long time4 = System.currentTimeMillis ();
                
              //printWriter.append
                long time5 = System.currentTimeMillis ();
                for(int i=0;i<1000000;i++)
                	pw.append("우리 집에 왜 왔니?append\n");
                long time6 = System.currentTimeMillis ();
                
              //printWriter.print
                long time7 = System.currentTimeMillis ();
                for(int i=0;i<1000000;i++)
                	pw.print("우리 집에 왜 왔니?print\n");
                long time8 = System.currentTimeMillis ();
                
              //printWriter.write
                long time9 = System.currentTimeMillis ();
                for(int i=0;i<1000000;i++)
                	pw.write("우리 집에 왜 왔니?print\n");
                long time10 = System.currentTimeMillis ();
                
                System.out.println ("test end");
                System.out.println ("println: " + ( time2 - time1 ) / 1000.0 );
                System.out.println ("printf: " + ( time4 - time3 ) / 1000.0 );
                System.out.println ("append: " + ( time6 - time5 ) / 1000.0 );
                System.out.println ("print: " + ( time8 - time7 ) / 1000.0 );
                System.out.println ("write: " + ( time10 - time9 ) / 1000.0 );
                
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                pw.flush();
                pw.close();
            }
    }
}

결과

실험 코드의 BufferedWriterPrintWriter의 append, auto flush 인자에 따라 결과가 다르다. 각 bool 값이

true, true

true false

false true

false false

PrintWriter의 autoflush를 true로 주면 버퍼 flush가 자주 일어나서 printf, println의 경우 지연이 10배 이상 난다. 버퍼를 한 번에 많이 쓰는 경우가 아닐 경우 되도록 autoflush를 끄거나 append, print, write를 이용하자.

추가(BufferedWriter)

BufferedWriter의 write와 append

실험 코드

          //bufferedWriter.append
            long time13 = System.currentTimeMillis ();
            for(int i=0;i<1000000;i++)
                bufferedWriter.append("우리 집에 왜 왔니?print\n");
            long time14 = System.currentTimeMillis ();

인자는 true false

profile
배고픈 개발자 sayi입니다!

0개의 댓글