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

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

측정한 결과가 한번만 실행한 결과를 표현하는 방법은 아니라는 생각에 10회를 반복한 결과를 첨부합니다.
실행환경:
프로세서: Inter Core2 Duo CPU P8700 2.53
메모리 : 4G
운영체제: Window 7 64Bit
자바 버전: 1.6.0_26
개발툴 : 이클립스 헬리오스
테스트파일 : 100Mbyte

Result:

DataInputStream[1024] takes 1077 ms
BufferedInputStream[1024] takes 378 ms
InputStream[1024] takes 1020 ms

DataInputStream[2048] takes 628 ms
BufferedInputStream[2048] takes 376 ms
InputStream[2048] takes 810 ms

DataInputStream[4096] takes 692 ms
BufferedInputStream[4096] takes 365 ms
InputStream[4096] takes 520 ms

DataInputStream[8192] takes 347 ms
BufferedInputStream[8192] takes 520 ms
InputStream[8192] takes 354 ms

파일 복사 시간은 DataInputStream 과 InputStream 이 비슷하게 나왔습니다.
가장 좋은 성능을 보인것은 BufferedInputStream 입니다. 그렇지만 버퍼 사이즈를 증가 시키면 성능이
저하되는 부분이 있었습니다.

Data:
                 Data    Buffer    Input
BufferSize=1024    938    360    921   
BufferSize=2048    587    318    572   
BufferSize=3072    383    468    389   
BufferSize=4096    275    287    276   

BufferSize=1024    927    319    921   
BufferSize=2048    606    316    885   
BufferSize=3072    382    316    391   
BufferSize=4096    282    806    316   

BufferSize=1024    1000    360    909   
BufferSize=2048    624    351    651   
BufferSize=3072    2626    324    388   
BufferSize=4096    299    816    370   

BufferSize=1024    1075    348    1334   
BufferSize=2048    597    345    1000   
BufferSize=3072    428    341    409   
BufferSize=4096    299    1008    301   

BufferSize=1024    972    340    1033   
BufferSize=2048    622    337    1161   
BufferSize=3072    412    334    412   
BufferSize=4096    664    311    301   

BufferSize=1024    1382    335    936   
BufferSize=2048    609    418    634   
BufferSize=3072    857    387    437   
BufferSize=4096    426    435    452   

BufferSize=1024    1162    523    1061   
BufferSize=2048    746    639    823   
BufferSize=3072    549    367    504   
BufferSize=4096    317    303    643   

BufferSize=1024    959    328    939   
BufferSize=2048    647    339    636   
BufferSize=3072    412    341    691   
BufferSize=4096    318    383    296   

BufferSize=1024    989    396    1096   
BufferSize=2048    655    357    643   
BufferSize=3072    469    437    1165   
BufferSize=4096    305    310    291   

BufferSize=1024    1372    473    1055   
BufferSize=2048    592    348    1096   
BufferSize=3072    404    338    416   
BufferSize=4096    289    543    296   

코드가 지저분해도 이해를 부탁드립니다.

Source:

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;

import java.io.InputStream;

import java.io.OutputStream;

 

public class CompareDataNBuffer {

    

    /**

     * DataInputStream 을 사용하여 파일을 복사한경우. 

     */

    public long useDataInputStream(int bufferSize, File f) throws IOException {

        File outFile = new File("d:/"+System.currentTimeMillis()+".zip");

        DataInputStream dis = new DataInputStream(new FileInputStream(f));

        

        // 출력 파일명은 임의로 설정 했습니다.

        DataOutputStream dos = new DataOutputStream(

                new FileOutputStream(outFile));

        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();

        dos.close();

        dis.close();

        outFile.delete();

        return getDuration(sTime);

    }

 

    /**

     * BufferedInputStream 을 사용하여 파일을 복사한경우.

     */

    public long useBufferInputStream(int bufferSize, File f) throws IOException {

        File outFile = new File("d:/"+System.currentTimeMillis()+".zip");

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));

        // 출력 파일명은 임의로 설정 했습니다.

        BufferedOutputStream bos = new BufferedOutputStream(

                new FileOutputStream(outFile));

        

        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();

        bos.close();

        bis.close();

        outFile.delete();

        return getDuration(sTime);

    }

    

    public long useInputStream(int bufferSize, File f) throws IOException {

        File outFile = new File("d:/"+System.currentTimeMillis()+".zip");

        InputStream is = new FileInputStream(f);

        OutputStream os = new FileOutputStream(outFile);

        long sTime = System.currentTimeMillis();

        int readSize = 0;

        byte[] buffer = new byte[bufferSize];

        while((readSize = is.read(buffer)) > 0) {

            os.write(buffer, 0, readSize);

        }

        os.flush();

//        System.out.println("InputStream["+ bufferSize

//                +"]. It takes " + getDuration(sTime) +" ms.");

        os.close();

        is.close();

        outFile.delete();

        

        return getDuration(sTime);

        

    }

 

    /**

     * 시간을 측정함.

     */

    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;

        

        int count = 10;

        long[][][] time = new long[count][4][3];

        for (int t = 0; t < count; t++) {

            for (int i = 0, len = 4; i < len; i++) {

//                System.out.println("==> Buffer Size is " + size);

                // DataInputStream을 사용하는 경우 

                 time[t][i][0] = compareDataNBuffer.useDataInputStream(size, f100);

                // BufferedInputStream을 사용하는 경우

                 time[t][i][1] = compareDataNBuffer.useBufferInputStream(size, f100);

                // InputStream 을 사용하는 경우

                 time[t][i][2] = compareDataNBuffer.useInputStream(size, f100);

                size = size * 2;

            }

            size = 1024;

        }

        

        // 반복횟수 10회

        // 버퍼 차이에 따라 4회 1024 2048 4096 8192

        // 방법에 따라 3회  Data Buffer InpuStream

        long d1024 = 0;

        long b1024 = 0;

        long i1024 = 0;

        long d2048 = 0;

        long b2048 = 0;

        long i2048 = 0;

        long d4096 = 0;

        long b4096 = 0;

        long i4096 = 0;

        long d8192 = 0;

        long b8192 = 0;

        long i8192 = 0;

        System.out.println("\t\t\t\t\t   Data\t\tBuffer\t\tInput");

        for(int i=0, len=time.length; i<len; i++) {

            for(int j=0, jLen=time[0].length; j<jLen;j++) {

                System.out.print("BufferSize="+((j+1)*1024)+"\t");

                for(int k=0, kLen=time[0][0].length; k<kLen; k++) {

                    long temp = time[i][j][k];

                    

                    switch (j) {

                    case 0:

                        switch (k) {

                        case 0:

                            d1024 += temp;

                            break;

                        case 1:

                            b1024 += temp;

                            break;

                        case 2:

                            i1024 += temp;

                            break;

                        }

                        

                        break;

 

                    case 1:

                        switch (k) {

                        case 0:

                            d2048 += temp;

                            break;

                        case 1:

                            b2048 += temp;

                            break;

                        case 2:

                            i2048 += temp;

                            break;

                        }

                        

                        break;

                        

                    case 2:

                        switch (k) {

                        case 0:

                            d4096+=temp;

                            break;

                        case 1:

                            b4096+=temp;

                            break;

                        case 2:

                            i4096+=temp;

                            break;

                        }

                        

                        break;

                        

                    case 3:

                        switch (k) {

                        case 0:

                            d8192+= temp;

                            break;

                        case 1:

                            b8192+= temp;

                            break;

                        case 2:

                            i8192+= temp;

                            break;

                        }

                        

                        

                        break;

                        

                    }

                    System.out.print(temp+"\t");

                }

                System.out.println();

            }

            System.out.println();

            

        }

        

        System.out.println("DataInputStream[1024] takes " + (d1024/count) +" ms");

        System.out.println("BufferedInputStream[1024] takes " + (b1024/count) +" ms");

        System.out.println("InputStream[1024] takes " + (i1024/count) +" ms");

        

        System.out.println();

        

        System.out.println("DataInputStream[2048] takes " + (d2048/count)+" ms");

        System.out.println("BufferedInputStream[2048] takes " + (b2048/count)+" ms");

        System.out.println("InputStream[2048] takes " + (i2048/count)+" ms");

   

        System.out.println();

        

        System.out.println("DataInputStream[4096] takes " + (d4096/count)+" ms");

        System.out.println("BufferedInputStream[4096] takes " + (b4096/count)+" ms");

        System.out.println("InputStream[4096] takes " + (i4096/count)+" ms");

        

        System.out.println();

        System.out.println("DataInputStream[8192] takes " + (d8192/count)+" ms");

        System.out.println("BufferedInputStream[8192] takes " + (b8192/count)+" ms");

        System.out.println("InputStream[8192] takes " + (i8192/count)+" ms");

        

        

        

//        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을 사용하는 경우

//            System.out.println();

//            compareDataNBuffer.useBufferInputStream(size, f500);

//            System.out.println();

//            // InputStream 을 사용하는 경우

//            compareDataNBuffer.useInputStream(size, f500);

//            System.out.println();

//            

//            

//            size = size*2;

//        }

    }

 

}


 


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중