Buffered I/O 클래스를 이용한 파일 I/O 시의 효율성 측정

[출처] http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=139547597

 

Question:

1. 주제: Buffered I/O 클래스를 이용한 파일 I/O시의 효율성 측정

2. 내용: 100M 이상의 큰 파일을 DataInputStream으로 읽은 후 DataOutputStream으로 다른 파일로 저장 하였을 경우와 BufferedInputStream으로 읽은 후 BufferedOutputStream으로 다른 파일로 저장 하였을 경우에 대한 시간차이를 구하시오.

3. 조건:

가. Buffered I/O를 사용하였을 경우 Buffer의 크기는 1k, 2k, 4k, 8k로 각각 측정하시오.

나. 반듯이 리눅스 환경에서 프로그래밍을 하여 출력 결과는 핵심부분만 캡쳐 하여 제출하시오.

4. 힌트

– 자바에서 프로그램 실행시간을 구하는 예제

class SystemExample11 {
    public static void main(String args[]) {

        long time1 = System.currentTimeMillis();

        double total = 0.0;

        for (int cnt = 1; cnt < 1000000000; cnt += 2) 
            if (cnt / 2 % 2 == 0)
                total += 1.0 / cnt;
            else
                total -= 1.0 / cnt;

        double pi = total * 4;

        long time2 = System.currentTimeMillis();
        System.out.println("result = " + pi);
        System.out.printf("계산에 %d ms가 소요되었습니다.", time2 - time1);
    }
}

이걸 해야하는데 아무리 해도 모르겠어요 ㅠ

 

Answer:

 

 

100MByte 이상 되는 파일과 500MByte 파일 두가지로 테스트를 진행 했습니다.
실행 환경은 리눅스 환경이 없어 윈도우에서 실행 했습니다. 자바의 특성상 리눅스에서도
소스 그대로 실행 하시면 구동 됩니다.(단지 파일명에만 주의 하십시오)

package com.blogspot.coozplz;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CompareDataNBuffer {

    /**
     * DataInputStream 을 사용하여 파일을 복사한경우. 
     */
    public void useDataInputStream(int bufferSize, File f) throws IOException {
        DataInputStream dis = new DataInputStream(new FileInputStream(f));

        // 출력 파일명은 임의로 설정 했습니다.
        DataOutputStream dos = new DataOutputStream(
                new FileOutputStream("d:/"+System.currentTimeMillis()+".zip"));
        int readSize = 0;
        byte[] buffer = new byte[bufferSize];
        long sTime = System.currentTimeMillis();

        while ((readSize = dis.read(buffer)) > 0) {
            dos.write(buffer, 0, readSize);
        }
        dos.flush();
        System.out.println("DataInputStream["+ bufferSize+"]" 
                +". It takes " + getDuration(sTime) +" ms.");
        dos.close();
        dis.close();
    }

    /**
     * BufferedInputStream 을 사용하여 파일을 복사한경우.
     */
    public void useBufferInputStream(int bufferSize, File f) throws IOException {
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
        // 출력 파일명은 임의로 설정 했습니다.
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("d:/"+System.currentTimeMillis()+".zip"));

        int readSize = 0;
        byte[] buffer = new byte[bufferSize];

        long sTime = System.currentTimeMillis();

        while((readSize = bis.read(buffer)) > 0) {
            bos.write(buffer, 0, readSize);
        }
        bos.flush();
        System.out.println("BufferedInputStream["+ bufferSize
                +"]. It takes " + getDuration(sTime) +" ms.");
        bos.close();
        bis.close();
    }

    /**
     * 시간을 측정함.
     */
    public long getDuration(long startTime) {
        return System.currentTimeMillis() - startTime;
    }

    public static void main(String[] args) throws IOException {
        CompareDataNBuffer compareDataNBuffer = new CompareDataNBuffer();
        // 100Mbyte 파일 
        File f100 = new File("d:/dataFile.zip");

        // 500MByte 파일
        File f500 = new File("d:/Tapsonic.zip");


        // 초기 버퍼 사이즈 입니다.
        int size = 1024;
        System.out.println("File Size is "+f100.length());
        for(int i = 1, len=4; i<=len; i++) {
            System.out.println("==> Buffer Size is " + size);
            // DataInputStream을 사용하는 경우 
            compareDataNBuffer.useDataInputStream(size, f100);

            // BufferedInputStream을 사용하는 경우
            compareDataNBuffer.useBufferInputStream(size, f100);
            System.out.println();
            size = size*2;
        }
        size = 1024;
        System.out.println("File Size is "+f500.length());
        for(int i = 1, len=4; i<=len; i++) {
            System.out.println("==> Buffer Size is " + size);
            // DataInputStream을 사용하는 경우 
            compareDataNBuffer.useDataInputStream(size, f500);
            // BufferedInputStream을 사용하는 경우
            compareDataNBuffer.useBufferInputStream(size, f500);
            System.out.println();
            size = size*2;
        }
    }

}

[출력결과]

File Size is 114482881
==> Buffer Size is 1024
DataInputStream[1024]. It takes 1060 ms.
BufferedInputStream[1024]. It takes 375 ms.

==> Buffer Size is 2048
DataInputStream[2048]. It takes 692 ms.
BufferedInputStream[2048]. It takes 374 ms.

==> Buffer Size is 4096
DataInputStream[4096]. It takes 1263 ms.
BufferedInputStream[4096]. It takes 1208 ms.

==> Buffer Size is 8192
DataInputStream[8192]. It takes 1997 ms.
BufferedInputStream[8192]. It takes 1923 ms.

File Size is 577189779
==> Buffer Size is 1024
DataInputStream[1024]. It takes 17725 ms.
BufferedInputStream[1024]. It takes 6152 ms.

==> Buffer Size is 2048
DataInputStream[2048]. It takes 26353 ms.
BufferedInputStream[2048]. It takes 6864 ms.

==> Buffer Size is 4096
DataInputStream[4096]. It takes 16938 ms.
BufferedInputStream[4096]. It takes 8632 ms.

==> Buffer Size is 8192
DataInputStream[8192]. It takes 11091 ms.
BufferedInputStream[8192]. It takes 9306 ms.


 

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s